`

Object.defineProperties 函数

阅读更多

转自https://msdn.microsoft.com/library/ff800817(v=vs.94).aspx

 

将一个或多个属性添加到对象,并/或修改现有属性的特性。

 
 
object.defineProperties(object, descriptors)
参数 
 
 
object

必需。 对其添加或修改属性的对象。 这可以是本机 JavaScript 对象或 DOM 对象。

descriptors

必需。 包含一个或多个描述符对象的 JavaScript 对象。 每个描述符对象描述一个数据属性或访问器属性。

返回值 
 
 

已传递给函数的对象。

备注 
 
 

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 中受支持,否则不受支持。

 

 

其中数据属性和访问器属性。为

数据属性和访问器属性

 

本节包括您可能需要的有关数据属性和访问器属性的所有信息。

Hh965578.collapse_all(zh-cn,VS.94).gif数据属性

数据属性 是可获取和设置值的属性。 数据属性将 value 和 writable 属性包含在其描述符中。

下表列出了数据属性描述符的特性。

 

数据描述符特性

说明

默认

value

属性的当前值。

undefined

writable

true 或 false。 如果 writable 设置为 true,则可以修改属性值。

false

enumerable

true 或 false。 如果 enumerable 设置为 true,则可以由 for…in 语句枚举属性。

false

configurable

true 或 false。 如果 configurable 设置为 true,则可以更改属性的特性且可以删除属性。

false

如果描述符没有 valuewritableget 或 set 特性且指定的属性名不存在,则会添加数据属性。

在 configurable 特性为 false 且 writable 为 true 时,可以更改 value 和 writable 特性。

Hh965578.collapse_all(zh-cn,VS.94).gif在未使用 defineProperty 的情况下添加的数据属性

如果您在未使用 Object.definePropertyObject.defineProperties 或 Object.create 函数的情况下添加数据属性,则 writableenumerable 和 configurable 特性都将设置为 true。 在添加属性后,可以使用Object.defineProperty 函数修改属性。

可以使用以下方式来添加数据属性:

  • 赋值运算符 (=),如下所示:obj.color = "white";

  • 对象文本,如下所示:obj = { color: "white", height: 5 };

  • 构造函数,如使用构造函数定义类型中所述

Hh965578.collapse_all(zh-cn,VS.94).gif访问器属性

只要设置或检索属性值,访问器属性 就会调用用户提供的函数。 访问器属性的描述符包含 get 特性和/或 set 属性。

下表列出了访问器属性描述符的特性。

 

访问器描述符特性

说明

默认

get

返回属性值的函数。 此函数没有参数。

undefined

set

设置属性值的函数。 它具有一个包含要分配的值的参数。

undefined

enumerable

true 或 false。 如果 enumerable 设置为 true,则可以由 for…in 语句枚举属性。

false

configurable

true 或 false。 如果 configurable 设置为 true,则可以更改属性的特性且可以删除属性。

false

在未定义 get 访问器时,如果尝试访问属性值,则将返回 undefined 值。 在未定义 set 访问器时,如果尝试向访问器属性赋值,则什么也不会发生。

Hh965578.collapse_all(zh-cn,VS.94).gif属性修改

如果对象已包含一个带指定名称的属性,则会修改该属性的特性。 在修改属性时,描述符中未指定的特性保持不变。

如果现有属性的 configurable 特性为 false,则唯一允许的修改是将 writable 特性从 true 更改为 false

可以将数据属性更改为访问器属性,反之亦然。 如果这样做,描述符中未指定的 configurable 和 enumerable 特性将保留在属性中。 描述符中未指定的其他特性将设置为其默认值。

可以通过多次调用 Object.defineProperty 函数以增量方式定义可配置的访问器属性。 例如,一次Object.defineProperty 调用可能仅定义一个 get 访问器。 稍后调用同一属性名称可能会定义一个 set 访问器。 之后,该属性将同时具有 get 访问器和 set 访问器。

若要获取适用于现有属性的描述符对象,可以使用 Object.getOwnPropertyDescriptor 函数 (JavaScript)

可以使用 Object.seal 函数 (JavaScript)和 Object.freeze 函数 (JavaScript)来阻止修改属性的特性。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics