【发布时间】:2022-12-24 19:52:20
【问题描述】:
person = {
id: 1,
name: 'John',
phone: '123-456-789',
getSetGen: function(){
for(var key in this){
this[`set${key}`]=function(value){
this[key] = value;
console.log(this[key]);
}
this[`get${key}`]=function(){
console.log(this[key]);
return this[key];
}
// for(key in this){
// console.log(this[key]);
// if(key!='getSetGen'){
// Object.defineProperty(this, `Set${key}`, {
// set : function (value) {
// this[key] = value;
// }
// });
// Object.defineProperty(self, `Get${key}`, {
// get : function () {
// return this.key;
// }
// });
// }
// }
}
}
person.getSetGen()
person.getname();
我正在尝试创建一个函数属性来为对象生成 getter 和 setter,并且可以与其他对象一起使用。
运行上面的代码后,setter 和 getter 不起作用,只是将函数作为“this[key]”而不是实际的属性和对象
【问题讨论】:
-
让我们从为什么开始。如果他们所做的只是将操作转发给属性本身,为什么还需要这些“getters/setters”。为什么不直接使用该属性?在你的代码中,你混合了两种方法,正确的 getter/setter “看起来”像常规属性,并且像它们一样被访问。并获取/设置方法,这被称为非常相似的方法。你想要哪一个?
-
这只是它可以做什么的模拟,但如果我想将属性设为私有,我将需要 setter 和 getter。对于第二个原因,生成 setter 和 getter 将允许将具有公共属性的对象转换为具有私有属性的对象,并改用 setter 和 getter。
-
长话短说:我假设你来自不同的编程语言?您愿意跳多少个循环,您愿意承受多少性能影响才能拥有私有属性?是的 JS 最近获得了私有字段,在此之前我们已经用闭包模拟了它们,但在大多数情况下这是不值得的。我仍然认为按照惯例隐私是更好的选择。
-
本来,这就是setter和getter的目的。此外,如果我想在添加属性之前向 setter 和 getter 添加一些代码并在不影响其余代码的情况下执行此操作,我可以通过 setter 和 getter 函数来完成。
-
我想我发现了你的问题。
for(var key in this)不是块范围的(for(key in this)甚至是一个全局变量),因此您的所有方法都指向您迭代的相同(最后一个)key。这里:What is the difference between "let" and "var"?。使用for(const key in this)
标签: javascript object getter-setter accessor