JavaScript的面向对象

JavaScript的面向对象与其他言语的面向对象,其实有很大的区分。

JavaScript是基于原型的面向对象体系,而传统言语(比方java)的面向对象都是基于类的。

组织函数

function Person(name, age, job) {
    this.age = age;
    this.name = name;
    this.job = job;
}

Person.prototype.sayName = function() {
    console.log(this.name);
}
var cody = new Person('cody', '24', 'frontend');
cody.name;
cody.sayName();

在这个罕见的组织函数写法中,我们须要晓得以下几点:

1.Person这个函数被定义后,会自带一个prototype属性,这个属性指向一个对象,既原型对象,这个对象同时有一个constructor属性,指向Person

Person.prototype = {
    constructor: Person
}

注重的是,一切函数都有prototype属性,并非只要组织函数才有。

2.cody这个经由过程组织函数天生的对象,有一个__proto__属性,它指向组织函数Person的原型对象,既Person.prototype
接见cody.name时,在它本身寻觅该属性,找到了,因而就返回该值。
接见cody.sayName时,也是先在它本身寻觅该属性,然则没法找到,因而最先经由过程原型链向上寻觅: 寻觅cody.__proto__,也就是Person.prototype原型对象,发现了该属性,因而返回这个要领。
接见cody.toString时,在Person.prototype原型对象上也找不到,这时候,继续向上寻觅,既寻觅Person.prototype.__proto__也就是Object.prototype,在它上面,能够找到toString

继续

function Animal(name) {
    this.name = name;
}
Animal.prototype.sayName = function() {
    console.log(this.name);
}

function Duck(name, color) {
    Animal.call(this, name);
    this.color = color;
}

Duck.prototype = new Animal();
// 也能够优化成如许,削减一次父级组织函数挪用
// Duck.prototype = Object.create(Animal.prototype);
Duck.prototype.constructor = Duck;
Duck.prototype.sayColor = function() {
    console.log(this.color);
}
var duck = new Duck('duck', 'yellow');
duck.sayColor();
duck.sayName();

前面我们说过,JS是基于原型的面向对象。所以,继续并不一定须要运用组织函数,我们能够基于一个已存在的对象,对这个对象举行继续。

var obj = {
    name: 'cody',
    say: function() {
        console.log(this.name)
    }
};

var sub = Object.create(obj);
sub.name = 'deepred';
sub.say(); // deepred

Object.create的道理是:

Object.create = Object.create || function(obj) {
    var F = function() {};
    F.prototype = obj;

    return new F();
}

ES6的class语法

ES6引入了class语法,让JS看起来更像是面向对象的言语,但这仅仅是语法糖罢了,背地仍然是基于原型的继续体式格局。

class Animal {
    constructor(name) {
        this.name = name;
    }
    sayName() {
        console.log(this.name)
    }
}

class Duck extends Animal {
    constructor(name, color) {
        super(name);
        this.color = color;
    }

    sayColor() {
        console.log(this.color);
    }

    sayName() {
        // 挪用父级同名要领
        super.sayName();
        console.log('duck sayname')
    }
}
var duck = new Duck('duck', 'red');
duck.sayColor();
duck.sayName();
    原文作者:深红
    原文地址: https://segmentfault.com/a/1190000014001219
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞