Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。
Object.defineProperty(obj, prop, descriptor)
参数: obj: 要定义属性的对象。 prop: 要定义或修改的属性的名称或 Symbol 。 descriptor: 要定义或修改的属性描述符。 返回值: 被传递给函数的对象。
一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。
注意: 数据描述符和存取描述符不能混合使用
当 writable 属性设置为 false 时,该属性被称为“不可写的”。它不能被重新赋值 在严格模式下,试图修改不可写的属性会报错TypeError: “xxx” is read-only 非严格模式下,改修不可写的属性不会报错,但是修改不成功
对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举 默认为 false
对象的属性是否可以被删除,以及除 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