簡體   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