Object.defineProperty

本文详细介绍了JavaScript中Object.defineProperty方法的使用,包括方法原型、参数解释、返回值及异常情况。通过示例代码展示了如何修改和添加对象属性,以及如何通过Object.defineProperty设置属性的特性,如可配置性、可枚举性、可重写性等。

Object.defineProperty方法

  方法原型

  Object.defineProperty 提供一种直接的方式来定义对象属性或者修改已有对象属性,方法原型如下:
      Object.defineProperty(obj,prop,descriptor)

  参数

    obj:必须,要在其上添加或修改属性的对象。
    prop:必须,待修改的属性名称
    descriptor: 待修改属性的相关描述
    descriptor 要求传入一个对象,其默认值如下:
    
   {
    	configurable: false,
    	enumerable: false,
    	writable: false,
    	value: null,
    	set: undefined,
    	get: undefined
     }

configurable: 属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable 、 enumerable 、 configurable 属性。
enumerable: 属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。
writable: 属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。
value: 属性的默认值。
set: 属性的重写器(暂且这么叫)。一旦属性被重新赋值,此方法被自动调用。
get: 属性的读取器(暂且这么叫)。一旦属性被访问读取,此方法被自动调用。

返回值

   已修改的对象

备注

   Object.defineProperty函数可执行的操作包括如下:
      当对象不具有指定的属性名称时,向对象添加新属性。
      当对象具有指定的属性名称时,修改现有的属性。
       如果要同时修改多个属性,则可以用Object.defineProperties。
   

异常情况

     obj参数不是对象。

      此对象不可扩展且属性名称不存在 (Object.preventExtensions,Object.seal,Object.freeze可阻止对象的扩展)。
      descriptor 具有 value 或 writable 特性,并且具有 get 或 set 特性。
      descriptor 具有 get 或 set 特性,上述特性不是函数且已定义。

示例代码

      
 列出对象属性
        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);
	}
列出对象属性的特性
	var descriptor = Object.getOwnPropertyDescriptor(obj, "name");
	for (var prop in descriptor) {
		document.write(prop + ': ' + descriptor[prop]);
		document.write(newLine);
         }


Object.defineProperty() 方法设置属性时,属性不能同时声明访问器属性( set 和 get )和 writable 或者 value 属性。 意思就是,某个属性设置了 writable 或者 value 属性,那么这个属性就不能声明 get 和 set 了,反之亦然。
 
var o = {},
 myName = 'erik';
Object.defineProperty(o, 'name', {
    value: myName,
    set: function(name) {
        myName = name;
    },
    get: function() {
        return myName;
    }
});


这种情况下,会报错
Uncaught TypeError: Invalid property.  A property cannot both have accessors and be writable or have a value, #<Object>(…)
修改 DOM 元素上的属性
var descriptor = Object.getOwnPropertyDescriptor(Element.prototype, "querySelector");
descriptor.value = "query";
descriptor.writable = false;
Object.defineProperty(Element.prototype, "querySelector", descriptor);
var elem = document.getElementById("div");
elem.querySelector = "anotherQuery";
document.write(elem.querySelector);
输出为query




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值