JavaScript之再谈对象之属性的特性
2018-03-15 00:30
381 查看
在各种语言中对象的属性都有很对特性,JavaScript也不例外。
对象属性中除了名字和值外,还有一些标识着它们可写,可枚举,可配置的特性,存取器也是可以看成属性的特性的。
一般属性有一个名称,四个特性分别是:值(value),可写性(writable),可枚举性(enumerable),可配置性(configurable)。
存取器不具有值和可写特性,存取器的四个特性:读取,写入,可枚举性,可配置性。
在ES5中定义了“属性描述符”,Object.getOwnPropertyDescriptor(对象,属性)就是可以查看该对象属性的特性,这个方法只能的到该函数自有属性的特性描述,想要获得继承属性的特性描述,需要遍历原型链。
console.log(Object.getOwnPropertyDescriptor(obj,'x'));
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));
能帮到你的话就收藏下吧。
--主页传送门--
对象属性中除了名字和值外,还有一些标识着它们可写,可枚举,可配置的特性,存取器也是可以看成属性的特性的。
一般属性有一个名称,四个特性分别是:值(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));
能帮到你的话就收藏下吧。
--主页传送门--
相关文章推荐
- javascript 理解对象--- 定义多个属性和读取属性的特性
- Javascript中的高级特性及特别对象、属性和方法
- javascript学习(九)对象属性的特性
- JavaScript中的高级特性及特别对象、属性和方法
- JavaScript中的高级特性及特别对象、属性和方法
- JavaScript中对象属性的特性
- JavaScript delete用法,属性,特性,执行上下文,激活对象 综合篇
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
- Javascript中的高级特性及特别对象、属性和方法
- JavaScript中的高级特性及特别对象、属性和方法
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- javascript中的对象属性类型与特性总结
- javascript中对象的属性的特性
- javascript中对象的属性的特性
- 遍历JavaScript对象中的属性和属性值
- JavaScript中String对象常见方法及属性
- Rudolph javascript 监听简单对象属性的变化 -- 回调函数的应用
- JavaScript[对象.属性]集锦
- Javascript基于对象三大特性(封装性、继承性、多态性)