【发布时间】:2013-05-29 23:17:20
【问题描述】:
我一直在浏览一些 shim/polyfill 库,发现其中一些有一个用于 Object.getPrototypeOf 的 shim。如果不存在,他们会使用__proto__,如果不存在则使用object.constructor.prototype。
我知道__proto__ 是“非标准”的,虽然与Object.getPrototypeOf 方法略有不同,但它们可以互换。
我也明白,原则上外部可访问的object.constructor.prototype 在其他两个都不存在的许多情况下就足够了(假设原型没有被重新分配)。
我遇到的问题是以下示例:
function findPropertyOwner(object, property) {
var count = 0;
do {
if (object.hasOwnProperty(property)) {
return [object, count];
}
object = Object.getPrototypeOf(object);
count += 1;
} while (object);
return undefined;
}
或者
function instanceOf(object, constructor) {
while (object) {
if (object === constructor.prototype) {
return true;
}
object = Object.getPrototypeOf(object);
}
return false;
}
在上面的例子中,我们可以说是“走链”,如果垫片回落到object.constructor.prototype,那么我们现在就会陷入无限循环的可怕情况。
我的问题:有没有办法在Object.getPrototypeOf和__proto__不存在的环境中实现上述代码?
我的感觉是没有,但我只是想检查一下,以防有一些我没有遇到过的信息。
【问题讨论】:
-
我仍然不明白为什么人们不推荐使用
__proto__。它可能已被弃用,但 AFAIK 目前处于 ES6 草案的规范部分。 people.mozilla.org/~jorendorff/es6-draft.html#sec-B.3.1 -
最好的办法是保留遇到的原型对象列表,并检查列表中的循环引用。如果找到,请跳转至
Object.prototype,或直接跳转至return false。 -
而这个:
while (object !== undefined && object !== null) {... 太长了。只需这样做:while (object != null) {...它会同时测试null和undefined。 -
您能提供更多信息吗?也许在 jsfiddle...
-
@Fabrício Matté 我知道讨论了,我会将措辞更改为“非标准”,就像在 MDN 页面上一样。
标签: javascript inheritance constructor prototype es5-shim