我正在尝试这个非常简单的例子来自Nicholas Zakas的精彩的“Web开发者专业JavaScript”一书,但我无法弄清楚我在这里做错了什么。必须是我错过的一些非常简单的东西,但我被困住了。
以下是代码:
'use strict';
var book = {};
Object.defineProperties(book, {
originYear: {
value: 2004,
writable: false
},
_year: {
value: 2004
},
edition: {
value: 1
},
year : {
get: function() {
return this._year;
},
set: function(newValue) {
if(newValue > this.originYear) {
this._year = newValue;
this.edition += newValue - this.originYear;
}
}
}
});
console.log(book.edition);
book.year = 2006;
console.log(book.edition);
我在Chrome控制台上遇到的错误是:
未捕获的TypeError:无法分配给#main.js的只读属性“_year”:31 Object.defineProperties.year.setmain.js:39(匿名函数)
有人可以解释我哪里出错吗?
以下是fiddle
答案 0 :(得分:35)
当您使用Object.defineProperties
时,默认情况下writable
设置为false
,因此_year
和edition
实际上只读属性。
明确地将它们设置为writable: true
:
_year: {
value: 2004,
writable: true
},
edition: {
value: 1,
writable: true
},
<强>
writable
强>
true
当且仅当与属性关联的值可以使用赋值运算符更改时 默认为false
。
答案 1 :(得分:0)
我尝试将year
更改为其他术语,并且有效。
public_methods : {
get: function() {
return this._year;
},
set: function(newValue) {
if(newValue > this.originYear) {
this._year = newValue;
this.edition += newValue - this.originYear;
}
}
}
答案 2 :(得分:0)
如果有时a link!不管用。 因此,创建一个临时对象并从可写对象中获取所有值,然后更改该值并将其分配给可写对象。应该完美。
var globalObject = {
name:"a",
age:20
}
function() {
let localObject = {
name:'a',
age:21
}
this.globalObject = localObject;
}
答案 3 :(得分:-5)
book.year.writable = true;
book.year = New Value;