Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

setter

概述

set 语法可以将一个函数绑定在当前对象的指定属性上,当那个属性被赋值时,你所绑定的函数就会被调用。

语法

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

参数

prop
将被指定函数绑定的属性名。
val
存有将要赋给 prop 的值的变量的代称。
expression
从 ECMAScript 6 开始,将被指定函数绑定的属性名可以是一个表达式。

描述

在 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 6 (ECMA-262)
Method definitions
Release Candidate 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 将不会被调用。

相关链接

文档标签和贡献者

 此页面的贡献者: Go7hic, teoli, nyx2014, LinusYu
 最后编辑者: Go7hic,