Object.defineProperty 函数 (JavaScript)

将属性添加到对象,或修改现有属性的特性。javascript

Object.defineProperty(object, propertyname, descriptor)

  

参数
 
 
object

必需。  要在其上添加或修改属性的对象。  这多是一个本机 JavaScript 对象(即用户定义的对象或内置对象)或 DOM 对象。  java

propertyname

必需。  一个包含属性名称的字符串。  ide

descriptor

必需。  属性描述符。  它能够针对数据属性或访问器属性。 函数

 

返回值
 
 

已修改对象。ui

备注
 
 

可以使用 Object.defineProperty 函数来执行如下操做:this

  • 向对象添加新属性。  当对象不具备指定的属性名称时,发生此操做。  spa

  • 修改现有属性的特性。  当对象已具备指定的属性名称时,发成此操做。  prototype

描述符对象中会提供属性定义,用于描述数据属性或访问器属性的特性。  描述符对象是 Object.defineProperty 函数的参数。  3d

若要向对象添加多个属性或修改多个现有属性,可以使用 Object.defineProperties 函数 (JavaScript)code

异常
 
 

若是如下任一条件为 true,则引起 TypeError 异常:

  • object 参数不是对象。

  • 此对象不可扩展且指定的属性名称不存在。

  • descriptor 具备 value 或 writable 特性,而且具备 get 或 set 特性。

  • descriptor 具备 get 或 set 特性,上述特性不是函数且已定义。

  • 指定的属性名称已存在,现有属性具备 false 的 configurable 特性,且 descriptor 包含一个或多个与现有属性中特性不一样的特性。  可是,当现有属性具备 false 的 configurable 特性和 true 的 writable 特性时,则容许 value 或 writable 特性不一样。  

 

添加数据属性

在如下示例中,Object.defineProperty 函数向用户定义的对象添加数据属性。  若改成向现有的 DOM 对象添加属性,则取消对 var = window.document 行的注释。

var newLine = "<br />";

// Create a user-defined object.
var obj = {};

// Add a data property to the object.
Object.defineProperty(obj, "newDataProperty", {
    value: 101,
    writable: true,
    enumerable: true,
    configurable: true
});

// Set the property value.
obj.newDataProperty = 102;
document.write("Property value: " + obj.newDataProperty + newLine);

// Output:
// Property value: 102

若要列出对象属性,请将如下代码添加到此示例中。

var names = Object.getOwnPropertyNames(obj);
for (var i = 0; i < names.length; i++) {
    var prop = names[i];

    document.write(prop + ': ' + obj[prop]);
    document.write(newLine);
}

// Output:
//  newDataProperty: 102

若要修改对象的属性特性,请将如下代码添加到前面所示的 addDataProperty 函数。   descriptor 参数只包含 writable 特性。  其余数据属性特性保持不变。

// Modify the writable attribute of the property.
Object.defineProperty(obj, "newDataProperty", { writable: false });

// List the property attributes by using a descriptor.
// Get the descriptor with Object.getOwnPropertyDescriptor.
var descriptor = Object.getOwnPropertyDescriptor(obj, "newDataProperty");
for (var prop in descriptor) {
    document.write(prop + ': ' + descriptor[prop]);
    document.write(newLine);
}

// Output
// writable: false
// value: 102
// configurable: true
// enumerable: true

在如下示例中,Object.defineProperty 函数向用户定义的对象添加访问器属性。

var newLine = "<br />";

// Create a user-defined object.
var obj = {};

// Add an accessor property to the object.
Object.defineProperty(obj, "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 property value.
obj.newAccessorProperty = 30;
document.write("Property value: " + obj.newAccessorProperty + newLine);

// Output:
// in property set accessor
// in property get accessor
// Property value: 30

若要列出对象属性,请将如下代码添加到此示例中。

var names = Object.getOwnPropertyNames(obj);
for (var i = 0; i < names.length; i++) {
    var prop = names[i];

    document.write(prop + ': ' + obj[prop]);
    document.write(newLine);
}
// Output:
// in property get accessor
// newAccessorProperty: 30
 
修改访问器属性
若要修改对象的访问器属性,请将如下代码添加前面所示的代码。    descriptor 参数只包含 get 访问器定义。  其余属性特性保持不变。  
 
// Modify the get accessor.
Object.defineProperty(obj, "newAccessorProperty", {
    get: function () { return this.newaccpropvalue; }
});

// List the property attributes by using a descriptor.
// Get the descriptor with Object.getOwnPropertyDescriptor.
var descriptor = Object.getOwnPropertyDescriptor(obj, "newAccessorProperty");
for (var prop in descriptor) {
    document.write(prop + ': ' + descriptor[prop]);
    document.write(newLine);
}

// Output:
// get: function () { return this.newaccpropvalue; }
// set: function (x) { document.write("in property set accessor" + newLine); this.newaccpropvalue = x; }
// configurable: true
// enumerable: true

下面的示例演示如何经过使用 Object.getOwnPropertyDescriptor 函数来获取和修改属性的属性描述符,从而自定义内置 DOM 属性。  对于此示例中,必须经过使用 ID 为“div”的 DIV 元素。  

// Get the querySelector property descriptor.
var descriptor = Object.getOwnPropertyDescriptor(Element.prototype, "querySelector");

// Make the property read-only.
descriptor.value = "query";
descriptor.writable = false;
// Apply the changes to the Element prototype.
Object.defineProperty(Element.prototype, "querySelector", descriptor);

// Get a DOM element from the HTML body.
var elem = document.getElementById("div");

// Attempt to change the value. This causes the revised value attribute to be called.
elem.querySelector = "anotherQuery";
document.write(elem.querySelector);

// Output:
// query
 
相关文章
相关标签/搜索