gpt4 book ai didi

javascript - Javascript 可写描述符是否会阻止实例更改?

转载 作者:搜寻专家 更新时间:2023-10-31 23:08:24 25 4
gpt4 key购买 nike

答案(请阅读下面的答案,他们各自的作者提供了宝贵的见解):

  • "writable: false"阻止分配新值,但是Object.defineProperty 不是赋值操作,因此忽略“可写”的值
  • 属性是继承的,因此属性将在每个上保持不可写子类/实例,直到一个子类(或子类的实例)为自己将“可写”的值更改回真

问题:

关于属性“可写”描述符状态的 MDN 文档:

writable true if and only if the value associated with the property may be changed with an assignment operator. Defaults to false.

官方 ECMA-262 第 6 版或多或少有相同的说法。意思很清楚,但据我理解,它仅限于原始属性(即该特定对象上的属性)

但是,请考虑以下示例 ( JSFiddle ):

//works as expected, overloading complete       
var Parent = function() {};
Object.defineProperty(Parent.prototype, "answer", {
value: function() { return 42; }
});

var Child = function() {};
Child.prototype = Object.create(Parent.prototype, {
answer: {
value: function() { return 0; }
}
});

var test1 = new Parent();
console.log(test1.answer()); //42
var test2 = new Child();
console.log(test2.answer()); //0

//does not work as expected
var Parent2 = function() {};
Object.defineProperty(Parent2.prototype, "answer", {
value: function() { return 42; }
});

var Child2 = function() {};
Child2.prototype = Object.create(Parent2.prototype);

test3 = new Parent2();
console.log(test3.answer()); //42
test4 = new Child2();
test4.answer = function() { return 0; };
console.log(test4.answer()); //42

在这个例子之后,我们看到,虽然该属性不可写,但它可以在子类 (test2) 的原型(prototype)上重载,正如我所期望的那样。

但是,当尝试在子类 (test4) 的实例上重载该方法时,它会无提示地失败。我本来希望它能像 test2 一样工作。尝试重载 Parent 实例上的属性时也会发生同样的情况。

同样的事情发生在 NodeJS 和 JSFiddle 中,在某些情况下,重载实例会抛出一个关于属性只读性质的 TypeError。

您能否向我确认这是预期的行为?如果是,解释是什么?

最佳答案

是的,这是预期的行为。

it fails silently.

不完全是。或者:仅在草率模式下。如果你"use strict" mode , 你会得到一个

Error { message: "Invalid assignment in strict mode", … }

在线 test4.answer = function() { return 0; };

it can be overloaded on the prototype of a subclass (test2), but not an instance of a subclass (test4)

这与实例与原型(prototype)无关。您没有注意到的是您正在使用不同的方式来创建重载属性:

  • inherited and non-writable 属性的赋值失败
  • Object.defineProperty 调用只会创建一个新属性,除非该对象是不可扩展的

您可以为您的实例做同样的事情:

Object.defineProperty(test4, "answer", {
value: function() { return 42; }
});

关于javascript - Javascript 可写描述符是否会阻止实例更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35177663/

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