为什么我不能在JavaScript中更改对象属性

时间:2019-11-02 19:14:44

标签: javascript

我对这些对象的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。

2 个答案:

答案 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',
});