在javascript中使用setter和方法的区别

在javascript中使用setter和方法的区别,javascript,setter,Javascript,Setter,我正在阅读javascript中的getter和setter。我想知道这两种使用和不使用setter的编码方式之间是否有区别 第一条路,没有二传手 >obj1 = { arr: []; } >obj1.arr.push('first') >obj1.arr [ 'first' ] 第二条路,二传手 >obj2 = { set add(data) { this.arr.push(data); }, arr: [] } &

我正在阅读javascript中的getter和setter。我想知道这两种使用和不使用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' ] 

首先,
set
语法将对象属性绑定到定义的函数。在这个特定的示例中,两个代码之间没有区别,但假设您想在将值添加到数组之前检查该值是否为负值,因此可以使用set to封装该行为

所以基本上,使用setter只是向对象的函数添加额外的封装行为

访问数组索引的方法称为括号表示法。它等于点表示法,但括号表示法允许您动态设置对象或数组的新属性


希望这对你有帮助

我认为区别只在于“它看起来如何”。对于从面向对象语言学习js的人来说,使用setter是最接近理解js的方法

示例中的setter语法并没有真正阻止客户机代码仍然像第一个代码块中那样使用direct
push
调用添加值。所以不同的是,你只是添加了另一种方法来做同样的事情

为了进行公平的比较,您必须在两个备选方案中定义相同的方法:一次作为普通方法,一次作为setter方法,然后区别在于参数传递给方法的语法,可以使用
obj.add('first')
obj.add='first'

在这种实际情况下,我会投票反对setter,因为它会给人一种错误的印象,即如果“指定”另一个值,则会覆盖第一个指定的值:


。。。但显然情况并非如此:两个值现在都存在于对象中。

getter/setter属性与“普通”实例属性不同,一个称为“命名数据属性”,另一个称为“命名访问器属性”

请让met在下面引用ECMAScript 5.1中的部分文档

对象是属性的集合。每个属性都是一个 命名数据属性、命名访问器属性或内部 财产:

命名数据属性将名称与ECMAScript语言相关联 值和一组布尔属性

命名访问器属性将名称与一个或两个访问器相关联 函数和一组布尔属性。访问器函数是 用于存储或检索以下ECMAScript语言值: 与属性关联

内部属性没有名称,无法通过直接访问 ECMAScript语言运算符。内部属性的存在纯粹是为了 规范目的

命名(非内部)属性有两种访问方式:get 和put,分别对应于检索和赋值

如果属性的值未由此函数显式指定 命名属性的规范,表中定义的默认值 使用7

@andy push()是数组的一种方法。我没有编写一个方法(即push2())来更好地说明我的问题,而是使用了这个内置方法。
obj.add = 'first';
obj.add = 'second';