首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法中修改对象的自身属性

在方法中修改对象的自身属性
EN

Stack Overflow用户
提问于 2021-06-23 06:55:23
回答 2查看 37关注 0票数 0

有没有一种方法可以从对象自己的方法中更改对象中的属性?

代码语言:javascript
复制
let dog = {
  name: 'shar-pei',
  changeName: () => {
    // reassign name property
  }
}
EN

回答 2

Stack Overflow用户

发布于 2021-06-23 07:14:08

你可能认为这会起作用。

代码语言:javascript
复制
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,则不起作用

代码语言:javascript
复制
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

解决方案是使用普通函数,如下所示:

代码语言:javascript
复制
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"

不过,请考虑使用classprototype

代码语言:javascript
复制
/** 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();
票数 0
EN

Stack Overflow用户

发布于 2021-06-23 07:17:20

不起作用的原因是您使用的是箭头函数。我建议您阅读一下arrow functions and this,以便更好地理解您在使用箭头函数时所处的上下文。

如果你能把你的函数变成一个普通的方法,然后使用this就足够让它工作了。

如下所示:

代码语言:javascript
复制
let dog = {
  name: 'shar-pei',
  changeName: function() {
    // reassign name property
    this.name = 'other-name';
  }
}
console.log(dog.name);
dog.changeName();
console.log(dog.name);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68091550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档