JavaScript之再谈对象之属性的特性

        在各种语言中对象的属性都有很对特性,JavaScript也不例外。

        对象属性中除了名字和值外,还有一些标识着它们可写,可枚举,可配置的特性,存取器也是可以看成属性的特性的。

        一般属性有一个名称,四个特性分别是:值(value),可写性(writable),可枚举性(enumerable),可配置性(configurable)。

        存取器不具有值和可写特性,存取器的四个特性:读取,写入,可枚举性,可配置性。

        在ES5中定义了“属性描述符”,Object.getOwnPropertyDescriptor(对象,属性)就是可以查看该对象属性的特性,这个方法只能的到该函数自有属性的特性描述,想要获得继承属性的特性描述,需要遍历原型链。

console.log(Object.getOwnPropertyDescriptor(obj,'x'));

       对象的属性还可以自己设置。

         通过Object.defineProperty(对象,属性,属性特性)。正如所示,方法第一个参数传入一个对象,第二个参数传入字符串形式的属性,第三个参数传入对象形式的特性。

var obj = {x : 1,};
	Object.defineProperty(obj,'x',{
                 value : 2,
                 writable : true,
                 enumerable : false,
                 configurable : true
});

        设置属性特性的时候有时候也不需要写那么多,当只写一个或者两个不写全的时候,其他的特性会默认为undefined或者false。

        当同时修改或者创建多个属性,用Object.defineProperties(对象,映射表),第一个参数是对象,第二个参数是映射表,如果是新建对象的话,第一个参数添加{}。

var obj1 = Object.defineProperties({},{
	x : { value : 4, writeable : true, enumerable : true, configurable : true},
	y : { value : 1, writeable : true, enumerable : true, configurable : true},
	r : { get : function(){return "1"}, enumerable : true, configurable : true},
});

        下面是使用Object.defineProperty()和Object.defineProperties() d的使用的一些规则:

        1.如果对象是不可扩展的,则可以剪辑已有的自由属性,但不能添加新属性
2.如果属性是不可配置的,则不能修改它的可配置性和可枚举性。
3.如果存取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转换成数据属性,
4.如果数据属性是不可配置的,则不能将它转换成存储器属性。
5.如果数据属性是不可配置的。则不能将它的可写性从false修改成true,但是可以从true改成false

6.如果数据属性是不可配置且不可写的,则不能修改它的值,然而可配置但不可写的属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转化成不可写的)。

        当在说extend 复制函数属性的时候,其实只是简单的复制属性值和属性名,并没有复制过来属性的特性。当我们学到设置对象属性的特性的时候就可以封装方法。

Object.defineProperty(Object.prototype,"exTend",{
	writable : true,
	enumerable : true,
	configurable :true,
	value : function(o){
		var names = Object.getOwnPropertyNames(o);
		for(var i = 0; i < names.length; i ++){
			console.log(names[i]);
			if(names[i] in this){
				continue;
			}
			var desc = Object.getOwnPropertyDescriptor(o,names[i]);
			Object.defineProperty(this,names[i],desc);
		}
	}
})
var obj3 = {};
console.log(obj3.exTend(o));

        能帮到你的话就收藏下吧。

        --主页传送门--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值