解决原型链中包含引用值类型的问题——借用构造函数

借用构造函数,又叫伪造对象经典继承

这种技术的基本思想是:在子类型构造函数的内部调用超类型的构造函数。别忘了,函数只不过是在特定环境中执行代码的对象,因此通过调用apply()和call()方法也可以在将来新创建的对象上执行构造函数。

例如:

function SuperType(){this.colors = ["red","blue","green"]};

function SubType(){

//继承了superType

SuperType.call(this);

}

var instance1 = new SubType();

instance1.colors.push("black");

alert(instance1.colors);//"red","blue","green","black"

var instance2 = new SubType();

alert(instance2.colors);//"red","blue","green"

解析:虽然color是引用类型值(Array),但是由于在子类型的构造函数里面调用了超类型的构造函数,我们实际上是在将来新创建的SubType实例的环境下调用了SuperType的构造函数,这样就会在新SubType对象上执行SuperType函数中定义的所有对象初始化代码。结果,SubType的每个实例就都会具有自己的color属性的副本了,一个实例修改它的引用类型的时候不会影响另一个实例。

优势:相对于原型链而言,借用构造函数有一个很大的优势,即可以在子类型构造函数中向超类型构造函数传递参数。例如:

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

function SubType(){

//继承了SuperType,同时还传递了参数

SuperType.call(this.,"Nicholas");

//实例属性

this.age = 29;

}

var instance = new SubType();

alert(instance.name);//"Nicholas"

alert(instance.age);//29

以上代码中的SuperType只接受一个参数name,因此该参数会直接赋值给一个属性。在SubType构造函数内部调用SuperType构造函数时,实际上是为SubType的实例设置了name属性。为了确保SuperType构造函数不会重写子类型的属性,可以在调用超类型构造函数后,再添加应该在子类型中定义的属性。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值