我对这些对象的age属性犯了一个错误,当我以后尝试重新分配不同的值时,它根本不会更改。
我希望它可以与Object.create
方法一起使用。我该怎么做才能解决此问题?
var personProto = {
calculateAge: function() {
console.log(2019 - this.yearOfBirth)
},
fullName: function() {
console.log(this.name + ' ' + this.lastName)
}
}
var sam = Object.create(personProto, {
name: { value: "samuel" },
yearOfBirth: { value: 1092 },
lastName: { value: "max" },
job: { value: "developer" }
});
sam.yearOfBirth = 1992;
sam.calculateAge(); // 927
console.log(sam.calculateAge());
给我927,即使我将YearOfOfBirth更改为1992,而输出本来应该是27,也仍然是1092。
答案 0 :(得分:5)
默认情况下,使用Object.create
分配的属性不可写。尝试写入不可写的属性是JavaScript中的一个无提示错误,这是使用严格模式的众多原因之一。
这又是您的代码,但在严格模式下:
'use strict';
var personProto = {
calculateAge:function(){
console.log(2019 -this.yearOfBirth)
},
fullName:function(){
console.log(this.name + ' ' + this.lastName)
}
}
var sam = Object.create(personProto, {
name:{value:'samuel'},
yearOfBirth:{value:1092},
lastName:{value:'max'},
job:{value:'developer'}
});
sam.yearOfBirth = 1992;
console.log(sam.calculateAge());
927
请注意,它现在会引发错误并告诉您确切的问题。
要解决此问题,只需将属性设置为可写。
'use strict';
var personProto = {
calculateAge:function(){
console.log(2019 -this.yearOfBirth)
},
fullName:function(){
console.log(this.name + ' ' + this.lastName)
}
}
var sam = Object.create(personProto, {
name:{value:'samuel',writable:true},
yearOfBirth:{value:1092,writable:true},
lastName:{value:'max',writable:true},
job:{value:'developer',writable:true}
});
sam.yearOfBirth = 1992;
console.log(sam.calculateAge());
927
答案 1 :(得分:1)
Object.create
的第二个参数使用property descriptors,当您未指定时,writable
属性默认为false
。
我建议完全删除第二个参数,而使用Object.assign
在新对象上创建属性:
var sam = Object.assign(Object.create(personProto), {
name: 'samuel',
yearOfBirth: 1092,
lastName: 'max',
job: 'developer',
});