2014-03-03 68 views
1

我正在創建一個需要繼承的應用程序,但我不知道選擇哪種繼承方式。我發現有兩種方法可以定義類繼承,但我不知道它們之間的區別。通過設定他的原型在javascript中繼承類的最佳做法

ns.Document = function (id, name, content) { 
    ns.DocBase.call(this, id, name); 
    this._content = content; 
}; 

ns.Document.prototype = Object.create(ns.DocBase.prototype); 
ns.Document.prototype.constructor = ns.Document; 
ns.Document.prototype._content = null; 

文件夾從文檔庫繼承到new ns.DocBase()

ns.Folder = function (id, name, childs) { 
    ns.DocBase.call(this, id, name); 

    if (Array.isArray(childs)) { 
     childs.forEach(function (elem) { 
      if (elem instanceof ns.Folder) { 
       this._folders.push(elem); 
      } else if (elem instanceof ns.Document) { 
       this._documents.push(elem); 
      } 
     }); 
    } 
} 
ns.Folder.prototype = new ns.DocBase(); 
ns.Folder.prototype.constructor = ns.Folder; 
ns.Folder.prototype._documents = []; 
ns.Folder.prototype._folders = []; 

繼承的作品,並在這兩個兩種方式:

var ns = {}; // Namespace 
ns.DocBase = function (id, name) { 
    this._id = id; 
    this._name = name; 
}; 
ns.DocBase.prototype.constructor = ns.DocBase; 
ns.DocBase.prototype._id = null; 
ns.DocBase.prototype._name = null; 

文檔從文檔庫通過他的原型設置爲Object.create(ns.DocBase.prototype)繼承我可以從繼承類訪問屬性的方式,但我想知道在javascipt類中定義繼承的方式更好nd爲什麼。

+0

Prototype是一個共享對象當您將parent的實例(包含實例成員)設置爲此處顯示的child的原型時,可能會發生什麼情況。 http://stackoverflow.com/a/16063711/1641941 – HMR

回答

1

特別是在你提交的情況下,它們幾乎是一樣的,object.create(ns.DocBase.prototype)的一個小優勢在於它只繼承DocBase.prototype而不執行構造函數,因此分配的空間少於使用new(_id和_content not allocated on對象的原型)。
下面就來說明的差別的曲線圖(部分被省略):

enter image description here

通知folder._prototype額外_id和_name。

在你的榜樣真正的壞習慣是,你再在原型對象聲明的屬性:

ns.DocBase.prototype._id = null; 
ns.DocBase.prototype._name = null; 

,因爲你是在文檔(和文件夾)構造函數調用DocBase.call(this)不必要的操作。

+0

我在原型('ns.DocBase.prototype._id = null;')中聲明屬性,因爲我想要輕鬆找到哪些對象的屬性有沒有看內部構造函數,因爲我認爲構造函數只能操作他的屬性,而不能聲明新的屬性。這也是閱讀代碼更簡單的方法。 – Epsil0neR

+0

我認爲一個更好的和等價可讀的方法是在構造函數的開頭聲明對象屬性,就像在DocBase構造函數中聲明的那樣(聲明新屬性),因爲首先避免了額外的開銷,其次它更易於維護(更易於移除並添加新的屬性)。 –

+0

在原型上聲明「默認」屬性*不是壞習慣,但在這裏確實完全沒有必要。 – Bergi