首先看使用new Parent()赋值给Child.prototype的继承方式
function Parent () {
this.name = 'chenyou'
this.age = 18
this.eat = function(){console.log('吃饭')}
}
function Child () {
Parent.call(this)
}
//这里使用new Parent()赋值给Child.prototype
Child.prototype = new Parent()
/*注意此处相当于新建一个constructor属性,
而不是给__proto__中原有的属性赋值*/
Child.prototype.constructor = Child
console.log(Child.prototype)
console.log(new Child())
打印结果如下:
new Parent()直接赋值给Child.prototype的方式.png
如果使用中间对象实现继承则效果不同:
//这里使用中间对象
function inherits(Child, Parent) {
var F = function () {};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
}
inherits(Child, Parent)
console.log(Child.prototype)
console.log(new Child())
打印结果如下:
使用中间对象实现继承.png
总结:用父函数造一个新实例赋值给Child.prototype,这种方式的缺点是会把这个新实例自己的属性复制到子函数原型中,这种方式子函数创建对象时子实例的__ proto__又是指向了Child.prototype,而Child.prototype又是从父函数的实例那复制过来的,所以子实例的__ proto__中除了父函数的constructor和__ proto__还多了一些父实例的属性。使用中间对象则不会,因为这个中间对象的构造方法中没执行任何东西,从内存方面考虑也要优于前者。
网友评论