function inheritPrototype(subtype,supertype){ var prototype = Object(supertype.prototype); var prototype = supertype.prototype; //两者有什么区别 prototype.constructor = subtype; subtype.prototype = prototype; } function SuperType(name){ this.name = name; } SuperType.sayName = function(){ alert(this.name) } function SubType(name,age){ SuperType.call(this,name); this.age = age; } inheritPrototype(Subtype,SuperType);
例子来自于js高程。用手机打得 如有错误还望包涵
问题一 下面的两种创建对象的方式有区别吗?如果有,有什么区别
var prototype = Object(supertype.prototype); var prototype = supertype.prototype; //两者有什么区别
问题二
在例子中 超类与子类的原型是否指向了同一个原型对象?寄生组合继承能否被认为是把组合式继承中本来指向超类实例的原型指针转换成直接指向超类原型,从而达到越过超类构造函数的目的?
问题1的两个没有区别,因为Object作为普通函数调用,内部会自动转为new调用。
问题2这个你理解可能有偏差,首先对于寄生组合式继承,依赖于原型式继承。你仔细看书会发现,你问题一中的代码与书中的不同,书中是
object
(上面封装过的原型式继承方法),而你写的是Object
,这个我也不细说了,你重新看一下书体会一下。问题1,没有区别,http://www.365mini.com/page/j...
2,指向同一个原型对象,superType.prototype == subType.prototype //true
相对组合继承,其优点就是少调用一次超类构造函数。内存上来说就是原型链上少一层,使用起来是一样的
1.没有区别
2.指向的对象也是同一个,因为
inheritPrototype(subtype,supertype)
这个函数的目的就是要把超类型的原型副本继承给子类型。只是副本而已,相当于阉割版的超类型原型,子类型不会获得超类型的属性。如果按照组合式的
SubType.prototype = new SuperType()
,相当于重写了子类原型,即使你之后再手动的指明constructor
指向,在子类的原型上也会得到也许没必要得到的属性。show code:在这段代码中,最后这两个alert会弹出超类型上的属性值,因此,如果在
instance1
实例上,获取到一个超类型的属性,那么在子类型上的原型还会调用一次超类型SuperType()
,这显然是没有必要的。采用了寄生组合式继承,子类型根本不会得到这个属性,当
instance1
调用colors
的时候不会让子类型再调用一次超类型。解释的不好,希望对你有所裨益!