我正在阅读有关javascript中的getter和setter的文章。我想知道在有和没有设置器的两种编码方式之间是否有区别
第一种方式,没有二传手。
>obj1 = {
arr: [];
}
>obj1.arr.push('first')
>obj1.arr
[ 'first' ]
第二种方式,使用二传手。
>obj2 = {
set add(data) {
this.arr.push(data);
},
arr: []
}
>obj2.add = 'first'
>obj2.arr
[ 'first' ]
答案 0 :(得分:1)
您的示例中的setter语法并没有真正阻止客户端代码仍然像第一个代码块一样使用直接push
调用来添加值。因此,不同之处在于您只是添加了另一种方法来执行相同的操作。
为了进行公平的比较,您必须在两种选择中都定义 same 方法:一次是常规方法,一次是setter方法,然后区别仅在于语法如何参数通过obj.add('first')
或obj.add = 'first'
传递给方法。
在这种实际情况下,我会反对二传手,因为它给人一种错误的印象,即如果您“分配”另一个值,则第一个分配的值会被覆盖:
obj.add = 'first';
obj.add = 'second';
...但是显然不是这样:两个值现在都存在于对象中。
答案 1 :(得分:0)
首先,set
语法将对象属性绑定到已定义的函数。在此特定示例中,两个代码之间没有区别,但是例如,您要在将值添加到数组之前检查该值是否为负,因此可以使用set来封装该行为。
因此,基本上,使用setter只是将附加的封装行为添加到对象的功能中。
访问数组索引的方式称为括号表示法。它等于点符号,除了方括号符号允许您动态地为对象或数组设置新属性。
希望这对您有所帮助。
答案 2 :(得分:0)
我认为区别仅在于“它的外观”。使用setter,这是了解来自面向对象语言的js的人们的最接近方法。
答案 3 :(得分:0)
getter / setter属性与“普通”实例属性不同,一个称为“命名数据属性”,另一个称为“命名访问器属性”。
请在下面的ECMAScript 5.1文档的下面引用。
https://www.ecma-international.org/ecma-262/5.1/#sec-8.10.1
对象是属性的集合。每个属性都是 命名数据属性,命名访问器属性或内部 属性:
命名数据属性将名称与ECMAScript语言相关联 值和一组布尔属性。
命名访问器属性将名称与一个或两个访问器关联 函数和一组布尔属性。访问器功能是 用于存储或检索ECMAScript语言值,该值是 与该属性相关联。
内部属性没有名称,无法通过以下方式直接访问 ECMAScript语言运算符。内部属性纯粹是为了 规范目的。
对命名(非内部)属性有两种访问方式:get 和放置,分别对应于检索和分配。
还有
如果此属性未明确指定属性的值 命名属性的规范,表中定义的默认值 使用了7。