转自https://msdn.microsoft.com/library/ff800817(v=vs.94).aspx
将一个或多个属性添加到对象,并/或修改现有属性的特性。
object.defineProperties(object, descriptors)
descriptors 参数是一个包含一个或多个描述符对象的对象。
数据属性是可储存和检索值的属性。 数据属性描述符包含一个 value 特性和/或一个 writable 特性。 有关更多信息,请参见数据属性和访问器属性。
一旦设置或检索属性值,访问器属性就会调用用户提供的函数。 访问器属性描述符包含 set 特性和/或 get 特性。
如果对象已包含一个带指定名称的属性,则修改该属性的特性。 有关更多信息,请参见Object.defineProperty 函数 (JavaScript)。
若要创建一个对象并向新对象添加属性,则可使用 Object.create 函数 (JavaScript)。
在下面的示例中,Object.defineProperties 函数将数据属性和访问器属性添加到用户定义的对象。
该示例使用对象文本来创建具有 newDataProperty 和 newAccessorProperty 描述符对象的 descriptors 对象。
var newLine = "<br />"; var obj = {}; Object.defineProperties(obj, { newDataProperty: { value: 101, writable: true, enumerable: true, configurable: true }, newAccessorProperty: { set: function (x) { document.write("in property set accessor" + newLine); this.newaccpropvalue = x; }, get: function () { document.write("in property get accessor" + newLine); return this.newaccpropvalue; }, enumerable: true, configurable: true }}); // Set the accessor property value. obj.newAccessorProperty = 10; document.write ("newAccessorProperty value: " + obj.newAccessorProperty + newLine); // Output: // in property set accessor // in property get accessor // newAccessorProperty value: 10
与前面的示例类似,下面的示例将动态添加属性而不是使用对象文本添加。
var newLine = "<br />"; // Create the descriptors object. var descriptors = new Object(); // Add a data property descriptor to the descriptors object. descriptors.newDataProperty = new Object(); descriptors.newDataProperty.value = 101; descriptors.newDataProperty.writable = true; descriptors.newDataProperty.enumerable = true; descriptors.newDataProperty.configurable = true; // Add an accessor property descriptor to the descriptors object. descriptors.newAccessorProperty = new Object(); descriptors.newAccessorProperty.set = function (x) { document.write("in property set accessor" + newLine); this.newaccpropvalue = x; }; descriptors.newAccessorProperty.get = function () { document.write("in property get accessor" + newLine); return this.newaccpropvalue; }; descriptors.newAccessorProperty.enumerable = true; descriptors.newAccessorProperty.configurable = true; // Call the Object.defineProperties function. var obj = new Object(); Object.defineProperties(obj, descriptors); // Set the accessor property value. obj.newAccessorProperty = 10; document.write ("newAccessorProperty value: " + obj.newAccessorProperty + newLine); // Output: // in property set accessor // in property get accessor // newAccessorProperty value: 10
若要修改对象的属性特性,请添加以下代码。 Object.defineProperties 函数修改 newDataProperty 的 writable特性,并修改 newAccessorProperty 的 enumerable 特性。 它将 anotherDataProperty 添加进对象,因为该属性名不存在。
Object.defineProperties(obj, { newDataProperty: { writable: false }, newAccessorProperty: { enumerable: false }, anotherDataProperty: { value: "abc" } });
在 Internet Explorer 9 标准、Internet Explorer 10 标准和 Windows 8.x 应用商店 app 中受支持。 仅在 DOM 对象的 Internet Explorer 8 中受支持,否则不受支持。
其中数据属性和访问器属性。为
数据属性和访问器属性
本节包括您可能需要的有关数据属性和访问器属性的所有信息。
数据属性
数据属性 是可获取和设置值的属性。 数据属性将 value 和 writable 属性包含在其描述符中。
下表列出了数据属性描述符的特性。
value |
属性的当前值。 |
undefined |
writable |
true 或 false。 如果 writable 设置为 true,则可以修改属性值。 |
false |
enumerable |
true 或 false。 如果 enumerable 设置为 true,则可以由 for…in 语句枚举属性。 |
false |
configurable |
true 或 false。 如果 configurable 设置为 true,则可以更改属性的特性且可以删除属性。 |
false |
如果描述符没有 value、writable、get 或 set 特性且指定的属性名不存在,则会添加数据属性。
在 configurable 特性为 false 且 writable 为 true 时,可以更改 value 和 writable 特性。
在未使用 defineProperty 的情况下添加的数据属性
如果您在未使用 Object.defineProperty、Object.defineProperties 或 Object.create 函数的情况下添加数据属性,则 writable、enumerable 和 configurable 特性都将设置为 true。 在添加属性后,可以使用Object.defineProperty 函数修改属性。
可以使用以下方式来添加数据属性:
-
赋值运算符 (=),如下所示:obj.color = "white";
-
对象文本,如下所示:obj = { color: "white", height: 5 };
-
构造函数,如使用构造函数定义类型中所述
访问器属性
只要设置或检索属性值,访问器属性 就会调用用户提供的函数。 访问器属性的描述符包含 get 特性和/或 set 属性。
下表列出了访问器属性描述符的特性。
get |
返回属性值的函数。 此函数没有参数。 |
undefined |
set |
设置属性值的函数。 它具有一个包含要分配的值的参数。 |
undefined |
enumerable |
true 或 false。 如果 enumerable 设置为 true,则可以由 for…in 语句枚举属性。 |
false |
configurable |
true 或 false。 如果 configurable 设置为 true,则可以更改属性的特性且可以删除属性。 |
false |
在未定义 get 访问器时,如果尝试访问属性值,则将返回 undefined 值。 在未定义 set 访问器时,如果尝试向访问器属性赋值,则什么也不会发生。
属性修改
如果对象已包含一个带指定名称的属性,则会修改该属性的特性。 在修改属性时,描述符中未指定的特性保持不变。
如果现有属性的 configurable 特性为 false,则唯一允许的修改是将 writable 特性从 true 更改为 false。
可以将数据属性更改为访问器属性,反之亦然。 如果这样做,描述符中未指定的 configurable 和 enumerable 特性将保留在属性中。 描述符中未指定的其他特性将设置为其默认值。
可以通过多次调用 Object.defineProperty 函数以增量方式定义可配置的访问器属性。 例如,一次Object.defineProperty 调用可能仅定义一个 get 访问器。 稍后调用同一属性名称可能会定义一个 set 访问器。 之后,该属性将同时具有 get 访问器和 set 访问器。
若要获取适用于现有属性的描述符对象,可以使用 Object.getOwnPropertyDescriptor 函数 (JavaScript)。
可以使用 Object.seal 函数 (JavaScript)和 Object.freeze 函数 (JavaScript)来阻止修改属性的特性。
相关推荐
Object.defineProperty和Object.defineProperties更简单、更Object.defineProperty包装器。 兼容性 回退到旧浏览器的愚蠢obj.prop = value分配。 安装 使用 : component install darsain/definer 用法 var ...
通过整理最近几年的微信和新浪表情包放到一个压缩包中,同时2018最新的也更新进去了,如果采集或者入库有需要的可以下载,解压即可。
在 ES5中新增了不少新的API, 例如 新增了 Object.xxx相关的方法,其中有一个定义属性相关的 Object.defineProperty 这个方法(还有Object.defineProperties)这个方法是 vue框架实现数据监听的核心方法,它的定义如下: ...
前端开源库-static-props静态属性,使用object.defineproperties定义静态对象属性
使用Object.defineProperty如果可用); 退回旧发动机的标准配置。 现有属性不会被覆盖。 接受属性名称映射到谓词,该谓词为true时将强制覆盖。例子var define = require ( 'define-properties' ) ;var assert = ...
Xccessors标准Xcessors Standard在支持旧版非标准访问器方法的浏览器中实现ECMAScript 5(以前为3.1)的Object.defineProperty , Object.defineProperties和Object.getOwnPropertyDescriptor 。 除了可配置,可枚举...
'''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''') await asyncio.sleep(30) #人工输入账号密码登录 print('开始登录……') await page.goto('...
Object . defineProperties ( Person . prototype , { // Methods can be passed directly. sayHi : d ( function ( ) { console . log ( 'Hello, my name is' , this . fullName ) ; } ) ,
在昨天的《Javascript权威指南》学习笔记之十:ECMAScript ... Object.defineProperties(per, { “nickName”: { value:”Tom”, writable:true }, “age”: { value:20, configurable:false, writable:false } }); var
CSS颜色实用程序 这个简单的网络应用将成为CSS颜色选择器,而一些最流行的在线颜色选择器将缺少某些功能。 我要实现的功能是: 即时转换为RGB,十六进制和HSL色彩系统 ...使用Object.defineProperties 伸缩盒
ie8.js Internet Explorer 8中缺少JavaScript方法的Polyfill。...----------------------------- | :: ------------------- ---:Object.create | Internet Explorer 7,8 Object.defineProperties | Internet
vue-dayjs 一个将Dayjs...Object.defineProperties(Vue.prototype, { $date : { get () { return dayjs } }}) ; main.js //Pluginsimport ' @/plugins/Dayjs ' ; 如果您需要使用dayjs库中的其他插件。 插件/Dayjs.js
前: Object . defineProperties ( obj , { foo : { configurable : true , enumerable : true , get : function ( ) { return 'blah' } } , bar : { configurable : true , enumerable : true , get : function ( ...
Larwan只为现代浏览器设计,利用Object.defineProperties等新功能来提供无痛且快速的界面,就像普通的Javascript一样。 结果,它可以在Internet Explorer 9 +,Firefox 4 +,Chrome和Opera 12+中运行。 这意味着它...
var $__Object$defineProperties = Object.defineProperties; var Person = function() { "use strict"; function Person(firstName, lastName) { this.firstName = firstName; this....
Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if ...
cesium-导航插件
try{Object.defineProperties(Ticker,{interval:{get:Ticker._getInterval,set:Ticker._setInterval},framerate:{get:Ticker._getFPS,set:Ticker._setFPS}})}catch(a){console.log(a)}Ticker.init=function(){Ticker...
不变的可数本文档介绍了JavaScript编码风格。 它不需要任何工具,依赖项或任何类型的库。... const { entries , fromEntries , defineProperties } = Objectconst immen = { writable : false , enumerable : true
JavaScript设计模式-构造函数模式