您的位置:首页 > Web前端 > JavaScript

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

2018-03-15 00:30 351 查看
        在各种语言中对象的属性都有很对特性,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));


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

        --主页传送门--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息