2014-03-26 112 views
3

因此,每提及__proto__後通常會引用Brendan Eich的請求,以免使用它。我一直在使用Typescript進行反思,將一個類的原型鏈導航到一個使用它的祖先類,並且願意注入一個包含類元數據的單一原型屬性。Typescript和__proto__屬性

有沒有人有任何具體的性能開銷,我可能會招致,或不依賴於__proto__的解決方案?

編輯 - 用代碼更新。這只是我輸入的一個人爲的例子,但它說明了我希望做的事情。我不太確定如何對由__proto__突變引起的pergieved減速進行基準測試。但無論如何我還是給了它一個鏡頭。實例化,原型屬性訪問和方法調用執行沒有不同的修改。

class Base { 
    public getClassName() : string { 
     return this['_className'] || undefined; 
    } 
} 

class Intermediate extends Base { 
} 

class Final extends Intermediate { 
} 

function traverseProtoChain(derivedClass, baseClass) { 
    var cursor = derivedClass.prototype; 
    while (cursor instanceof baseClass) { 
     if (isDefined(cursor.constructor)) { 
      var className = getProtoName(cursor); 
      if (isValidString(className)) 
       cursor['_className'] = getProtoName(cursor); 
     }   

     if (isDefined(cursor.__proto__)) { 
      cursor = cursor.__proto__; 
     } 
    } 
} 
+0

顯示你認爲的代碼 – basarat

回答

5

可以使用的ECMAScript 5.1標準:

Object.getPrototypeOf(cursor) 

對於真的很老版本的瀏覽器,你可以嘗試將回落到__proto__如果Object.getPrototypeOf不存在,但你可以決定是否根據您的具體情況,這些瀏覽器很重要。

這是一個顯示這個的例子。 bar.prototype不起作用,因爲它是一個實例。 getPrototypeOf的作品,併爲您提供與勸阻__proto__相同的答案。

class Foo { 
    constructor(name: string) { 

    } 
} 

class Bar extends Foo { 

} 

var bar = new Bar('x'); 

console.log(bar.prototype); 
console.log(Object.getPrototypeOf(bar)); 
console.log(bar.__proto__); 

所以,你可以寫在「皆大歡喜」 ...

if (Object.getPrototypeOf) { 
    console.log(Object.getPrototypeOf(bar)); 
} else if (bar.__proto__) { 
    console.log(bar.__proto__); 
} 

最終曲線球... __proto__極有可能成爲在ECMAScript中6標準化......值得銘記!

+0

感謝您的詳細文章。我意識到get | setPrototypeOf,並在我的庫中實現了一個polyfill。我只是在尋找關於它如何影響性能的信息。 Brendan Eich表示,鑑於現代JS實現,__proto__變異可能會對性能產生負面影響。 – Frostie

+0

答案總是要衡量它,看看它是否確實如此。 – Fenton