面向对象(继承)
2017-10-12 本文已影响0人
divine_zhouo
1:借用构造函数
function Parent(){
this.name = "Parent"
}
Parent.prototype.say = function(){}
function Child(){
Parent.call(this)
this.type= "Child"
}
console.log(new Child())
注意:
this代表:如果Child函数作为普通函数使用,为window。如果是作为构造函数(new child()),为new的是咧
缺点:
只能继承父类自己的属性,父类原型上的属性不能继承,如Parent.prototype.say = function(){},newChild实例就无法继承
2:借助原型链
function Parent(){
this.name = "Parent"
this.Arr = [1,2,3]
}
function Child(){
this.type= "Child"
}
Child.prototype = new Parent()
优点:
解决了借用构造函数的缺点问题,可以继承父类原型上的属性
缺点:
var child1 = new Child()
var child2 = new Child()
child1.Arr.push(4)
这时child2.Arr也变成了[1,2,3,4]
因为它们的原型指向是一样
3:组合方式继承(即1和2的组合)
function Parent(){
this.name = "Parent"
this.Arr = [1,2,3]
}
function Child(){
Parent.call(this)
this.type= "Child"
}
Child.prototype = new Parent()
var child1= new Child()
缺点:
执行new Child()时执行了两遍父类new Parent()和Parent.call(this)两处
可以将Child.prototype = new Parent()改为Child.prototype = Parent.prototype
但这样的话,Child的实例的constructor就指向了Parent而不是Child
因为我们把 Parent.prototype赋值给了Child.prototype
所以最终优化为:Child.prototype = Object.create(Parent.prototype)