gpt4 book ai didi

javascript - __proto__,什么时候会消失?备择方案?

转载 作者:行者123 更新时间:2023-12-03 14:38:07 25 4
gpt4 key购买 nike

Mozilla 声称它会在不久前(~2008 年)删除 __proto__ 并且它仍然在浏览器中。它还会被弃用吗?它也适用于 Opera(我认为是 Safari)和 Chrome。我不需要担心 IE,所以我很想继续使用它。

但是,我不希望我的代码有一天停止工作,所以我的问题是:

__proto__ 允许简单的继承:

a.__proto__ = {'a':'test'}

无论如何我可以以符合标准的方式复制它吗?我知道有函数继承,这很丑陋,而且它使我只想创建一个原型(prototype)链的事实过于复杂。只是想知道是否有任何巫师解决了这个问题。

谢谢

最佳答案

注:更改 __proto__ 的值被认为是一种不好的做法。 . JavaScript 的创建者 Brendan Eich 等人强烈反对这样做。事实上 __proto__ 属性已从一些 JavaScript 引擎(如 Rhino)中完全删除。如果您想知道原因,请阅读 following comment布伦丹·艾希(Brendan Eich)。

更新:浏览器不会删除 __proto__ 属性(property)。事实上,ECMAScript Harmony现在已经标准化了 __proto__ 属性(property)和 setPrototypeOf 功能。 __proto__ 仅出于遗留原因支持属性。强烈建议您使用 setPrototypeOf getPrototypeOf 而不是 __proto__ .

警告:虽然 setPrototypeOf 现在是一个标准,你仍然不鼓励使用它,因为改变对象的原型(prototype)总是会扼杀优化并使你的代码变慢。另外,使用 setPrototypeOf 通常表示代码质量差。

你不必担心你现有的代码有一天会失效。 __proto__ 属性(property)在这里留下来。

现在,对于手头的问题。我们希望以符合标准的方式做类似的事情:

var a = {
b: "ok"
};

a.__proto__ = {
a: "test"
};

alert(a.a); // alerts test
alert(a.b); // alerts ok

显然你不能使用 Object.create实现这一目标,因为我们没有创建一个新对象。我们只是试图改变内部 [[proto]]给定对象的属性。问题是无法更改内部 [[proto]]对象创建后的属性(通过使用 __proto__ 除外,这是我们试图避免的)。

所以为了解决这个问题,我写了一个简单的函数(注意它适用于除函数之外的所有对象):
function setPrototypeOf(obj, proto) {
var result = Object.create(proto);
var names = Object.getOwnPropertyNames(obj);
var getProp = Object.getOwnPropertyDescriptor;
var setProp = Object.defineProperty;
var length = names.length;
var index = 0;

while (index < length) {
var name = names[index++];
setProp(result, name, getProp(obj, name));
}

return result;
}

因此,我们现在可以在创建任何对象后更改其原型(prototype),如下所示(请注意,我们实际上并没有更改对象的内部 [[proto]] 属性,而是创建一个具有与给定对象相同属性并继承自给定的原型(prototype)):

var a = {
b: "ok"
};

a = setPrototypeOf(a, {
a: "test"
});

alert(a.a); // alerts test
alert(a.b); // alerts ok
<script>
function setPrototypeOf(obj, proto) {
var result = Object.create(proto);
var names = Object.getOwnPropertyNames(obj);
var getProp = Object.getOwnPropertyDescriptor;
var setProp = Object.defineProperty;
var length = names.length;
var index = 0;

while (index < length) {
var name = names[index++];
setProp(result, name, getProp(obj, name));
}

return result;
}
</script>


简单高效(我们没有使用 __proto__ 属性)。

关于javascript - __proto__,什么时候会消失?备择方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com