Object.defineProperty ゞ 浴缸里的玫瑰 2022-02-19 14:09 180阅读 0赞 `Object.defineProperty()` 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 语法节 Object.defineProperty(obj, prop, descriptor) 参数节 obj 要在其上定义属性的对象。 prop 要定义或修改的属性的名称。 descriptor 将被定义或修改的属性描述符。 返回值节 被传递给函数的对象。 该方法允许精确添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,能够在属性枚举期间呈现出来([`for...in`][for...in] 或 [`Object.keys`][Object.keys][ ][Link 1]方法), 这些属性的值可以被改变,也可以被[删除][Link 2]。这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 `Object.defineProperty()` 添加的属性值是不可修改的。 如果对象中不存在指定的属性,`Object.defineProperty()`就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是`false`。`value`,`get`和`set`字段的默认值为`undefined`。一个没有`get/set/value/writable`定义的属性被称为“通用的”,并被“键入”为一个数据描述符。 ## 属性描述符[节][Link 3] ## 对象里目前存在的属性描述符有两种主要形式:**数据描述符**和**存取描述符**。**数据描述符**是一个具有值的属性,该值可能是可写的,也可能不是可写的。**存取描述符**是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。 **数据描述符和存取描述符均具有**以下可选键值: `configurable` 当且仅当该属性的 configurable 为 true 时,该属性`描述符`才能够被改变,同时该属性也能从对应的对象上被删除。**默认为 false**。 `enumerable` 当且仅当该属性的`enumerable`为`true`时,该属性才能够出现在对象的枚举属性中。**默认为 false**。 **数据描述符同时具有以下可选键值**: `value` 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。**默认为 [`undefined`][undefined]**。 `writable` 当且仅当该属性的`writable`为`true`时,`value`才能被[赋值运算符][Link 4]改变。**默认为 false**。 **存取描述符同时具有以下可选键值**: `get` 一个给属性提供 getter 的方法,如果没有 getter 则为 `undefined`。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入`this`对象(由于继承关系,这里的`this`并不一定是定义该属性的对象)。 **默认为 [`undefined`][undefined]**。 `set` 一个给属性提供 setter 的方法,如果没有 setter 则为 `undefined`。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。 **默认为 [`undefined`][undefined]**。 描述符可同时具有的键值 configurable enumerable value writable get set 数据描述符 Yes Yes Yes Yes No No 存取描述符 Yes Yes No No Yes Yes 如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。 记住,这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 [`Object.prototype`][Object.prototype],明确指定所有的选项,或者通过 [`Object.create(null)`][Object.create_null]将[`__proto__`][proto]属性指向[`null`][null]。 var o = {}; // 创建一个新对象 // 在对象中添加一个属性与数据描述符的示例 Object.defineProperty(o, "a", { value : 37, writable : true, enumerable : true, configurable : true }); // 对象o拥有了属性a,值为37 // 在对象中添加一个属性与存取描述符的示例 var bValue; Object.defineProperty(o, "b", { get : function(){ return bValue; }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true }); o.b = 38; // 对象o拥有了属性b,值为38 // o.b的值现在总是与bValue相同,除非重新定义o.b // 数据描述符和存取描述符不能混合使用 Object.defineProperty(o, "conflict", { value: 0x9f91102, get: function() { return 0xdeadbeef; } }); // throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors var o = {}; o.a = 1; // 等同于 : Object.defineProperty(o, "a", { value : 1, writable : true, configurable : true, enumerable : true }); // 另一方面, Object.defineProperty(o, "a", { value : 1 }); // 等同于 : Object.defineProperty(o, "a", { value : 1, writable : false, configurable : false, enumerable : false }); 原始链接: [https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global\_Objects/Object/defineProperty][https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Global_Objects_Object_defineProperty] [for...in]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...in [Object.keys]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys [Link 1]: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys [Link 2]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete [Link 3]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#%E5%B1%9E%E6%80%A7%E6%8F%8F%E8%BF%B0%E7%AC%A6 [undefined]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined [Link 4]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators [Object.prototype]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype [Object.create_null]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create [proto]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/__proto__ [null]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/null [https_developer.mozilla.org_zh-CN_docs_Web_JavaScript_Reference_Global_Objects_Object_defineProperty]: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
还没有评论,来说两句吧...