怎样理解构造函数的原型对象prototype

通过构造函数生成的实例对象中的属性和方法其实是从构造函数中"copy"一份后生成的, 也就是说虽然生成的对象是构造函数的实例, 但里面的属性和方法确实相互独立的, 比如下面的lilei.sayHi 和 hanmeimei.sayHi这两个方法虽然同名, 功能也一样, 但实际上是内存中的两个不同地址里的函数, 因此他们是不全等的. 

function Person(name){
    this.name = name;
    this.sayHi = function(){
        console.log("Hi, I'm " + this.name);
    };
}

var lilei = new Person("Lilei");
var hanmeimei = new Person("Hanmeimei");

lilei.sayHi === hanmeimei.sayHi; // false

 

而原型对象则实现了实例对象使用构造函数方法/属性的"统一" / "同源"调用. 直白地讲, 如果把上面代码中的sayHi()方法定义在原型对象上, 那lilei.sayHi 和 hanmeimei.sayHi 就是全等的.

function Person(name){
    this.name = name;
}

Person.prototype.sayHi = function(){
    console.log("Hi, I'm " + this.name);
};

var lilei = new Person("Lilei");
var hanmeimei = new Person("Hanmeimei");

lilei.sayHi === hanmeimei.sayHi; // true

 

打个比方, 母亲生了两个孩子, 孩1和孩2, 他们都有眼睛闭嘴耳朵嘴巴, 但这些并不是母亲的器官, 而是从母亲那里继承过来的, 但母亲有一个玩具, 是奶奶的, 这个玩具是唯一的, 但奶奶可以玩, 母亲也可以玩, 孩1和孩2也可以玩, 这里的玩具就是定义在奶奶这个构造函数的对象原型prototype上的一个属性, 这个属性可以被继承的实例对象所使用. 而非像眼睛鼻子这种需要复制一份.

 

posted on 2019-10-14 11:11  aisowe  阅读(547)  评论(0编辑  收藏  举报

导航