非常教程

JavaScript参考手册

函数 | Function

set

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

语法

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

参数

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

描述

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

使用 set 语法时请注意:

  • 它的标识符可以是数字或字符串;

  • 它必须有一个明确的参数 (详见 Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments);

  • 在对象字面量中,不能为一个已有真实值的变量使用 set ,也不能为一个属性设置多个 set。

({ set x(v) { }, set x(v) { } }{ x: ..., set x(v) { } }是不允许的 )

setter 可以用delete操作来移除。

示例

在对象初始化时定义 setter

这将定义一个对象 language 的伪属性current,当分配一个值时,将使用该值更新log

var language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}

language.current = 'EN';
console.log(language.log); // ['EN']

language.current = 'FA';
console.log(language.log); // ['EN', 'FA']

请注意,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

使用计算属性名

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)The definition of 'Object Initializer' in that specification.

Standard

Initial definition.

ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Method definitions' in that specification.

Standard

Added computed property names.

ECMAScript Latest Draft (ECMA-262)The definition of 'Method definitions' in that specification.

Living Standard

浏览器兼容性

Feature

Chrome

Edge

Firefox (Gecko)

Internet Explorer

Opera

Safari

Basic support

1

(Yes)

2.0 (1.8.1)

9

9.5

3

Computed property names

No support

(Yes)

34 (34)

No support

No support

No support

Feature

Android

Chrome for Android

Edge

Firefox Mobile (Gecko)

IE Mobile

Opera Mobile

Safari Mobile

Basic support

(Yes)

(Yes)

(Yes)

1.0 (1.8.1)

(Yes)

(Yes)

(Yes)

Computed property names

No support

No support

?

34.0 (34.0)

No support

No support

No support

JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络