繁体   English   中英

Javascript原型继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM