编程语言
首页 > 编程语言> > Javascript可写描述符是否会阻止实例的更改?

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

作者:互联网

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

>“writable:false”阻止分配新值,但是
Object.defineProperty不是一个assignement操作,因此
忽略了“可写”的价值
>属性属性
是继承的,因此每个属性都不可写
子类/实例,直到一个子类(或子类的实例)将“可写”的值更改为自身的true

题:

有关属性“可写”描述符的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)的原型上重载,正如我所期望的那样.

但是,当尝试在子类的实例(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)

这与实例与原型无关.你没注意到的是你正在使用不同的方法来创建重载属性:

>对inherited and non-writable失败的财产的转让
> Object.defineProperty调用只是创建一个新属性,除非该对象是不可扩展的

您可以为您的实例执行相同的操作:

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

标签:javascript,node-js,inheritance,writable
来源: https://codeday.me/bug/20190608/1201522.html