[英]Javascript Prototypal inheritance
我正在阅读Alex Maccaw的Javascript Web Applications。 以下是构建Class构造函数的代码段。
var Class = function(parent){
var klass = function(){
this.init.apply(this, arguments);
};
// Change klass' prototype
if (parent) {
var subclass = function() { };
subclass.prototype = parent.prototype;
klass.prototype = new subclass;
};
klass.prototype.init = function(){};
// Shortcuts
klass.fn = klass.prototype;
klass.fn.parent = klass;
klass._super = klass.__proto__;
/* include/extend code... */
return klass;
};
我感兴趣的是
var subclass = function() { };
subclass.prototype = parent.prototype;
klass.prototype = new subclass;
他为什么不去
klass.prototype = parent.prototype;
他解释说:“围绕创建临时匿名函数的这种小动作阻止了在继承类时创建实例”。 这对我来说仍然没有意义,怎么会
klass.prototype = parent.prototype;
创建实例?
因为那样的话,您放在klass.prototype
上的klass.prototype
也将都放在parent.prototype
因为它们是同一对象。
他正在做的是创建一个从parent.prototype
继承的新对象,并将该对象分配给klass.prototype
,以便添加到该对象的任何属性都不会放在parent.prototype
。
仅供参考,一种更现代的方法是使用Object.create()
klass.prototype = Object.create(parent.prototype);
这基本上完成了同一件事。
您指出的这句话:
“”围绕创建临时匿名函数的这种小动作阻止了在继承类时创建实例“
...是一种奇怪的解释方式,除非在更大的上下文中有意义。 也许他的意思是说,您不需要调用parent
构造函数即可获取从parent.prototype
继承的对象。
如果您这样做:
klass.prototype = new parent();
它会完成相同的事情,除了将调用parent
构造函数,并且这样做可能会有不良的副作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.