簡體   English   中英

Crockford Prototypical Inheritance ......沒有原型鏈? 沒有超級?

[英]Crockford Prototypical Inheritance… no prototype chain? No super?

試圖更多地了解Crockford的原型繼承方法,他基本上消除了構造函數,從而消除了原型鏈或利用“超級”概念的任何現實可能性。

mynamespace.object.create = function( o ) {
    function F(){};
    F.prototype = o;
    return new F();
};

這是故意基於原型背后的理論嗎?

我遇到這個的原因是我想創建一個帶有init方法的基類,該方法執行一些常見的jquery工作(這些方法用於自動從對象創建jquery插件www.alexsexton.com/?p=51 )

作為一個例子,我不想在我的每個init方法中重復這一點this.options = $ .extend({},this.options,options);

所以我希望在基本init中使用它,覆蓋擴展對象中的init,然后在覆蓋中調用this.prototype.init來處理重復的東西。

object.create片似乎不允許我以任何方式這樣做。 我在這里錯過了什么嗎?

該技術以原型鏈為中心,這種類型的繼承也稱為差異繼承

例如:

var obj = {};
var obj1 = Object.create(obj);
var obj2 = Object.create(obj1);

obj2的原型鏈看起來像這樣:

--------        --------         ------------------
 obj2 ---> | obj1 | -----> | obj  | -----> | Object.prototype | -----> null
           --------        -------          ------------------

連接上例中對象的箭頭是內部[[Prototype]]屬性,它構成了原型鏈。

當您嘗試訪問屬性時,例如在obj2 ,它將沿着原型鏈上的所有對象進行搜索,直到找到,否則屬性訪問器將只是產生undefined

盡管有方法可以知道對象的[[Prototype]] ,但super的概念並不存在。

ECMAScript第5版引入了Object.getPrototypeOf方法,例如:

Object.getPrototypeOf(obj2) === obj1; // true

但是,此方法尚未得到廣泛支持 (以及標准的Object.create )。

某些實現通過__proto__屬性提供對對象[[Prototype]]訪問,例如:

obj2.__proto__ === obj1; // true

但請記住__proto__是非標准的。

isPrototypeOf方法是ECMAScript 3的一部分,它允許您知道對象是否在另一個對象的原型鏈中,例如:

obj1.isPrototypeOf(obj2);             // true
obj.isPrototypeOf(obj2);              // true
Object.prototype.isPrototypeOf(obj2); // true

總之,一個屬性在原型鏈中很快得到解決,如果你想避免使用__proto__Object.getPrototypeOf (因為第一個是非標准的,前者還沒有被廣泛支持),我只是建議你在您的init對象中添加前綴,因此可以從更具體的實例訪問它,例如:

var base = {
  baseInit: function () { /*...*/ }
};

var specific = Object.create(base);
specific.init = function () {
  //...
  this.baseInit();
  //...
};

specific.init();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM