在JavaScript中使用设置器或方法之间的区别

时间:2018-11-11 11:32:14

标签: javascript setter

我正在阅读有关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' ] 

4 个答案:

答案 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。