我正在学习 Codecademy 课程,并编写了以下有效的代码:
let person = {
_name: 'Lu Xun',
_age: 137,
set age (newAge) {
if (typeof newAge === 'number'){
this._age= newAge;
} else {
console.log('Invalid input');
}
}
}
person.age= 22;
console.log(person['_age']);
我正在了解该集合的工作原理,并认为它本质上与在 person 对象中定义方法相同,只是使用不同的语法。
所以我尝试了一下,调用了 Age 方法,使用调用方法的正常方式从对象外部传递 22 给它。它的工作原理是一样的。见下文。
let person = {
_name: 'Lu Xun',
_age: 137,
age: function (newAge) {
if (typeof newAge === 'number'){
this._age= newAge;
} else {
console.log('Invalid input');
}
}
}
person.age(22);
console.log(person['_age']);
使用“set”语法有什么好处?即当普通函数/方法定义以相同方式工作时为什么要使用它?
想象一下您编写了一段非常庞大的代码,其中很多代码都访问这样的变量:
// The object
const person = { age: 12 }
// You access it very often
console.log(person.age);
现在你肯定想根据出生日期计算年龄。使用某种方法,每次使用它时都必须将
person.age
替换为 person.getAge()
。这可能需要时间。使用 getter/setter,您只需替换一行,一切就可以继续工作。
如果您认为这不是问题,您可能想看看this java thread。 Java 没有 getter/setter。
get/set 语法适用于属性,而使用方法只是一种方法。大多数时候,一个简单的公共变量就足够了,但是有时,就像在您的示例中一样,您希望验证输入以确保它满足您对该值的任何期望。
还要考虑如何调用您的代码以及它的外观。如果您要使用函数来更改值并使用函数来获取值,您的代码将如下所示:
var myObject = new CoolObject('some parameter');
myObject.setComment('this is a super cool comment');
console.log(myObject.getComment());
如果你在你的属性上实现了 get/set 函数,它看起来像这样
var myObject = new CoolObject('some parameter');
myObject.comment = 'This is a super cool comment';
console.log(myObject.comment);
归根结底,这并不重要,因为两个代码片段都会做完全相同的事情,但其中一个更容易阅读,并且不会让您的同事对您大喊大叫。请记住,如果您只是公开一个公共变量,第二个示例不会改变。
关于 get 和 set 需要考虑的要点:
使用 get 和 set 定义的函数它不是函数,它是属性,例如要注意差异
let x = {
_prop: 1,
prop: function(){ return this._prop; }
};
因此,如果您需要使用此函数获取道具,您的代码将是
x.prop();
但是当您使用 get 时,该函数将作为属性被调用
let x = {
_prop: 1,
get prop(){ return this._prop; }
};
x.prop // this will display 1 no calls
通过注意这一点,您会知道现在您有函数来访问第一点的 prop 并使其成为 prop,因此在您的代码中您仍然正常使用 x.prop 和 Benfit 函数,该函数可能在访问该值之前执行操作,但实际上目标也可能很好
例如使用 set
const x = {
_prop: 1,
set prop(valueComeFromEqual){
// do any validation or prevent even update of !_prop
this._prop = valueComeFromEqual;
}
}
与 get 相同,当我们尝试分配值时,我们不会调用函数,它会像为普通属性分配值一样工作,但能够在分配时进行验证,甚至阻止更新,例如许多编码员在项目上工作,您需要 make确保他们不会创建更新 prop 值的方法,这样您就可以抛出异常,甚至在函数中不执行任何操作,这将保持 prop 值不更改分配值的示例
x.prop = 'this value sent as argument';
但需要注意的是,使用下划线不会创建私有属性,开发人员可以直接更改 x._prop 的值,但通常代码应该使用
x.prop
并且永远不要直接触及 x._prop ,因此好处之一是获取并设置更改通过使用函数获取 prop 的方式而不改变在代码中使用它的方式,它仍然是 x.prop
而不是 x.prop()
,分配新值的方式也是 x.prop = 'value';
正如我所说,这对于不需要更新的私有道具很有好处,或者在分配值之前进行验证,以防在获取值之前想要执行操作。