面向对象(继承)

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)
上一篇 下一篇

猜你喜欢

热点阅读