Object.defineProperty

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。

语法

Object.defineProperty(obj, prop, descriptor)

参数: obj: 要定义属性的对象。 prop: 要定义或修改的属性的名称或 Symbol 。 descriptor: 要定义或修改的属性描述符。 返回值: 被传递给函数的对象。

一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。

注意: 数据描述符和存取描述符不能混合使用

writable属性

当 writable 属性设置为 false 时,该属性被称为“不可写的”。它不能被重新赋值 在严格模式下,试图修改不可写的属性会报错TypeError: “xxx” is read-only 非严格模式下,改修不可写的属性不会报错,但是修改不成功

Enumerable 属性

对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举 默认为 false

Configurable 属性

对象的属性是否可以被删除,以及除 value 和 writable 特性外的其他特性是否可以被修改。

注意,如果描述符中的某些属性被省略,会使用以下默认规则

不像访问者属性,值属性始终在对象自身上设置,而不是一个原型。然而,如果一个不可写的属性被继承,它仍然可以防止修改对象的属性。

function myclass() {
}

myclass.prototype.x = 1;
Object.defineProperty(myclass.prototype, “y”, {
  writable: false,
  value: 1
});

var a = new myclass();
a.x = 2;
console.log(a.x); // 2
console.log(myclass.prototype.x); // 1
a.y = 2; // Ignored, throws in strict mode
console.log(a.y); // 1
console.log(myclass.prototype.y); // 1

参考