2014-03-26 78 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