有没有一种方法可以从对象自己的方法中更改对象中的属性?
let dog = {
name: 'shar-pei',
changeName: () => {
// reassign name property
}
}发布于 2021-06-23 07:14:08
你可能认为这会起作用。
let dog = {
name: 'shar-pei',
changeName: () => {
dog.name = "foobar";
}
}
console.log( dog.name ); // "shar-pei"
dog.changeName();
console.log( dog.name ); // "foobar"
如果你只有一个dog值,那么这个方法是可行的。
如果克隆dog (使用Object.create)或将dog值用作prototype,则不起作用
let dog = {
name: 'shar-pei',
changeName: () => {
dog.name = "foobar";
}
}
console.log( dog.name ); // "shar-pei"
dog.changeName();
console.log( dog.name ); // "foobar"
// Reset dog's name:
dog.name = "shar-pei";
// Clone a new dog with a different name:
let gromit = Object.create( dog );
gromit.name = "Gromit";
console.log( dog.name ); // "shar-pei"
console.log( gromit.name ); // "Gromit"
// Q: What do you think happens if we do this?
gromit.changeName();
// A: Gromit's name didn't change...
console.log( "gromit's name: " + gromit.name ); // "Gromit"
// ...but `dog`'s did!
console.log( "dog's name: " + dog.name ); // "foobar"
不幸的是,当与对象初始化器because it has a fixed, immutable this-binding一起使用时,不能在=>-style函数中使用this。
解决方案是使用普通函数,如下所示:
let dog = {
name: 'shar-pei',
changeName: function() {
this.name = "foobar";
}
};
console.log( dog.name ); // "shar-pei"
dog.changeName();
console.log( dog.name ); // "foobar"
// Reset dog's name:
dog.name = "shar-pei";
// Clone a new dog with a different name:
let gromit = Object.create( dog );
gromit.name = "Gromit";
console.log( dog.name ); // "shar-pei"
console.log( gromit.name ); // "Gromit"
// Q: What do you think happens if we do this?
gromit.changeName();
// A: Gromit's name now changes to "foobar"
console.log( "gromit's name: " + gromit.name ); // "gromit's name: foobar"
// ...and `dog`'s name remains unchanged:
console.log( "dog's name: " + dog.name ); // "dog's name: shar-pei"
不过,请考虑使用class或prototype:
/** Dog constructor: */
function Dog() {
this.name = "";
}
Dog.prototype.changeName = function() {
this.name = "foobar";
};
// Usage:
let sharPei = new Dog();
sharPei.changeName();
let gromit = new Dog();
gromit.changeName();发布于 2021-06-23 07:17:20
不起作用的原因是您使用的是箭头函数。我建议您阅读一下arrow functions and this,以便更好地理解您在使用箭头函数时所处的上下文。
如果你能把你的函数变成一个普通的方法,然后使用this就足够让它工作了。
如下所示:
let dog = {
name: 'shar-pei',
changeName: function() {
// reassign name property
this.name = 'other-name';
}
}
console.log(dog.name);
dog.changeName();
console.log(dog.name);
https://stackoverflow.com/questions/68091550
复制相似问题