因此,每次提到 __proto__ 后通常都会提到 Brendan Eich 请求不要使用它。我一直在使用 Typescript 进行一些反射,使用它将类的原型链导航到提供的祖先类,并且希望注入保存类元数据的单个原型属性。
有谁知道我可能产生的性能开销的具体情况,或者不依赖 __proto__ 的解决方案?
编辑-用代码更新。这只是我输入的一个人为示例,但它说明了我希望做什么。我不太确定如何对 __proto__ 突变引起的感知放缓进行基准测试。但无论如何我还是尝试了一下。实例化、原型属性访问和方法调用的执行方式在修改后没有任何不同。
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__;
}
}
}
您可以使用 ECMAScript 5.1 标准:
Object.getPrototypeOf(cursor)
对于非常旧版本的浏览器,您可以尝试回退到__proto__
if 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 中成为标准化...值得牢记!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)