作用
能够设置对象属性。比方给对象设置新属性或修正原有属性。
用法
示例
Object.defineProperty(obj,key,{
value: val,
enumerable:true,
writable: true,
configurable: false,
get:function(){},
set:function(){},
});
参数诠释
obj:要修正属性的对象,
key:要定义或修正属性值,
writable:给该属性赋值是不是能够见效,
enumerable:是不是能够经由过程 for in遍历该属性,
configurable:是不是可设置, 以及除 writable 特征外的其他特征是不是能够被修正。为
true属性时才被删除,才变动enumerable属性,不然会报错。赋值是一向都能够的。
下面定义一个空对象,然后用Object.defineProperty要领给这个空对象定义一个新的属性,设置它的writable参数为true。
var obj={ };
Object.defineProperty(obj,'test',{
value: 'test1',
writable: true,
});
console.log(obj);//obj{test:test1}
然后转变test属性的值。由于writeble的值为true,所以test属性的值是能够转变的。
obj.test="test2";//obj{test:test2}
假如writable的值为false,则test属性的值不会被转变。
Object.defineProperty(obj,'test',{
writable: false,
});
obj.test="test3";//obj{test:test2}
enumerable决议这个对象是不是能够经由过程for in遍历到该属性。true为能够经由过程for in遍历该属性。必需是configurable设置为true时enumerable的设置才见效。
Object.defineProperty(obj,'test',{
enumerable: !!false,
configurable: true
});
for(var pro in obj){
console.log(pro +':'+obj[pro]);
}//没有值打印出来
configurable的值为true时才删除属性。
delete obj.test;//胜利删除属性
每一个对象属性都有默许的get和set要领,我们能够改写它。
var myValue;
Object.defineProperty(obj,'haha',{
set:function () {//get和set要一同设
myValue='test test';
},
get:function(){
return myValue;
},
enumerable: true,
});
for(var pro in obj){
console.log(pro +':'+obj[pro]);
}//haha:undefined
console.log(obj.haha);//undefined
obj.haha='777';
console.log(obj.haha);//test test
只要给haha赋值时,obj.haha这个属性才会被给予set的值,不然会是 undefined。然则haha这个属性在赋值前就已被定义了。
运用场景
在组织函数里自定义set和get要领。
function Test() {
var pro = null;
Object.defineProperty(this, "pro", {
get: function () {
return pro;
},
set: function (value) {
pro = value
}
});
}
var mytest = new Test();//相当于把要领执行了一次
mytest.pro = haha;
console.log(mytest.pro);//haha
运用组织函数主如果限制自定义的set和get要领适用范围,比方上面的代码,就把这两个要领限制在mytest下。
我对上面一段的代码明白以下:
var Test1=function () {
function gg() {
this.tt=1;
}
gg.call(this);
};
var test = new Test1();
console.log(test.tt);