Js原型对象

最后更新于:2018-03-28 03:32:44

  1. 每个函数在创建的时候都有一个prototype(原型)属性,这个属性是一个指针,指向一个原型对象,而这个对象中包含着所有实例共享的属性和方法。
  2. 所有实例都有一个__proto__属性,它指向所属类的原型。
function Person() {

}
// 第一种
Person.prototype.name = "Nice";
Person.prototype.age = 28;
Person.prototype.sayName = function () {
    console.log(this.name);
}
// 第二种
Person.prototype = {
    name: "Nice",
    age: 28,
    sayName: function () {
        console.log(this.name);
    }
}
// 实例
let person1 =new Person();
let person2 =new Person();

如上面例子中,我们创建了一个Person的类,然后在其原型上添加了2个属性和1个方法,那么,实例person1和person2都会拥有这个2个属性和1个方法。下图简单说明关系:

prototype

第二种写法虽然更为简单,但是有一个问题,它会切断和原来原型之间的关系,所以需要手动添加constructor属性,并将值设为Person。而原生中的constructor属性是不可枚举的,可以重构将enumerable的值修改。

// 重构函数
Object.defineProperty("Person.prototype", "constructor", {
    enumerable: false,
    value: Person
});

重构后的关系:

prototype

注:原型模式最大的缺陷就是共享了所有的属性和方法,另外prototype__proto__都是指针。