首页 > js 寄生组合式继承

js 寄生组合式继承

我看书《JavaScript高级程序设计(第3版)》中的"寄生组合式继承"的部分,里面提到

不必为了指定子类型的原型而调用超类型的构造函数,我们所需要的无非就是超类型原型的一个副本而已.

然后书中的示例代码如下:

function inheritPrototype(subType, superType) {
    var prototype = Object(superType.prototype);    //创建对象
    prototype.constructor = subType;                //增强对象
    subType.prototype = prototype;                  //指定对象
}

这一行代码var prototype = Object(superType.prototype);,我感觉他的作用就是复制.但是我在网上却没有找到他的用法,相反,我倒是找到了这个方法Object.create(),

谁能和我简单的说一下Object()的用法以及和Object.create()的区别


http://yanhaijing.com/es5/#282 Object
http://yanhaijing.com/es5/#113 ToObject
可以看出传入的是对象的话 什么也不会做哦,返回传入对象的引用

http://yanhaijing.com/es5/#292 Object.create


javasript高级教程寄生组合继承里说的Object()应该指的是在原型式继承里写的
function object(o){
function F(){}
F.prototype=o;
return new F();
}
那下面一点点解释寄生组合继承。
1.首先它的出现是为了解决组合继承的缺点
缺点书上也有介绍:
SubType.prototype=new SuperType();//这样subType.prototype作为SuperType的实例,SubType.prototype就拥有了SuperType 的实例属性,这些实例属性(这里指的是SuperType的name,colors属性)可以被SubType的任意实例通过proto访问到。

new SubType("su",25);//这里调用构造函数时,会执行构造函数的程序,根据树上的代码,此时创建的
Subtype实例继承了SuperType的两个属性(name,colors),这里跟Subtype.prototype对象里的两个属性重复
(name、colors)
。不过Subtype的实例在按照原型链访问name,colors属性时,获取到的是实例对象的属性,这还是满足组合继承的初衷的,所以原型链中出现了这些多余的、不必要的属性,浪费内存吧。

2.其实思路还是原型链的思路,将Subtype.prototype作为另一个构造函数的实例,然后Subtype的实例就可以继承另一个构造函数原型对象上的属性了。

1)组合继承使用的是: SubType.prototype=new SuperType();
2)继承组合继承是这么用的,

function object(orig){
function F(){}
F.prototype=orig;//指向了同一个prototype对象
return new F();
}
function inheritP(SubType,SuperType){
var prototype=object(SuperType.prototype);
prototype.constructor=SubType;
SubType.prototype=prototype;
}

两种情况下,Subtype.prototype都指向了SuperType的原型对象,所以都可以通过proto访问到SuperType原型对象上的属性。

两种情况的差异就是能否获得SuperType的实例属性。
这里重点要明白new+构造函数时如何工作的,大概有四步
1)创建一个空对象obj
2)将obj.proto指向SuperTYype.prototype
3)SuperType.call(obj),使obj替换this获取到SuperType的实例属性。
4)返回obj(如果有引用类型return.覆盖obj).

第三步就是两种情况的差异所在:
组合继承,执行第三步,因为有实例属性存在,所以subType.protype就拥有了其实例属性。
而寄生组合继承,由于F(){}是空的,即是subType.protype不会拥有任何实例属性。

3.测试了下Object.create()的结果跟2是一样的,不过没有找到太多相关介绍。

目前我的认识是这样的,望指教。

【热门文章】
【热门文章】