setter

 

set  语法将对象属性绑定到要调用的一个函数上, 当尝试设置该属性时。

语法

{set prop(val) { . . . }}
{set [expression](val) { . . . }}

参数

prop
要绑定到给定函数的属性名。
val
用于保存尝试分配给prop的值的变量的一个别名。
expression
从ECMAScript 2015 (ES6)开始,还可以使用一个计算的属性名的表达式绑定到给定的函数。

描述

在 javascript 中,如果试着改变一个属性的值,那么对应的 setter 将被执行。setter 经常和 getter 连用以创建一个伪属性。一个拥有真实值的属性就不能再有 setter 了。

使用 set 语法时请注意:

setter 可以用  delete 操作来移除。

示例

在对象初始化时定义 setter

下面会为对象 o 定义一个伪属性 current ,当对它赋值时,将会把值更新到 log:

var o = {
  set current (str) {
    return this.log[this.log.length] = str;
  },
  log: []
}

请注意,current 属性是未定义的,访问它时将会返回 undefined。

delete 操作符移除一个 setter

我们可以使用 delete 操作符移除 setter。

delete o.current;

使用 defineProperty 为已存在的对象定义 setter

我们可以随时使用 Object.defineProperty() 给一个已经存在的对象添加一个 setter。

var o = { a:0 };
Object.defineProperty(o, "b", { set: function (x) { this.a = x / 2; } });
o.b = 10; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property
console.log(o.a) // 5

使用 computed 属性名

注意: Computed 属性是个实验性技术,属于 ECMAScript 6 提案的内容,现在它尚未广泛得到浏览器厂商的支持。在尚未支持 computed 属性的浏览器中使用时将会抛出一个语法错误。

var expr = "foo";
var obj = {
  baz: "bar",
  set [expr](v) { this.baz = v; }
};
console.log(obj.baz); // "bar"
obj.foo = "baz";      // run the setter
console.log(obj.baz); // "baz"

规范

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
Object Initializer
Standard Initial definition.
ECMAScript 2015 (6th Edition, ECMA-262)
Method definitions
Standard Added computed property names.

浏览器兼容性

根据 Robert Nyman's page 显示,在不支持 setter 的浏览器上(尤其是 IE6-8),将会抛出一个语法错误。

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1 2.0 (1.8.1) 9 9.5 3
Computed property names 未实现 34 (34) 未实现 未实现 未实现
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) 1.0 (1.8.1) (Yes) (Yes) (Yes)
Computed property names 未实现 未实现 34.0 (34.0) 未实现 未实现 未实现

SpiderMonkey 用户注意

 

  • 从  JavaScript 1.8.1 开始 ,在设置对象属性和数组初始化时,setters 将不会被调用。

相关链接

文档标签和贡献者