Object.defineProperty(obj,prop,descriptor) 返回被传递给函数的对象
descriptor.png
obj 要在其上定义属性的对象
prop 要定义或修改属性的名称
descriptor 将被定义或修改的属性描述(数据描述、存取描述)
是一个对象(configurable,enumerable,value,writable,get,set)
reflect.defineProperty(obj,prop,descriptor)
返回一个Boolean值,用于表示属性是否定义成功
其他功能和Object.defineProperty用法一样
基本使用
var obj = {a:1};
Object.defineProperty(obj,"key",{
configurable:false, // 默认为false,只有当为true时,属性可以从对象上被删除
enumerable:false, // 默认为false,只有为true时,该属性才能够出现在对象的枚举属性中。for...in 循环或Object.keys(obj)遍历对象的属性
// 描述符:设置set和get时,不可设置value和writable,反之同理
// 1.数据描述符
value:'static', // 默认为undefined,属性对应的值,可为任意有效的js值(数值对象函数等)
writable:false, // 默认为false,只有为true时,value才能被赋值运算符改变
// 2.存取描述符
get:undefined, // 访问该属性时,该方法会被执行,无参数传递,会传入this对象
set:undefined // 属性值修改时,触发执行该方法,接受唯一参数,即该属性新的参数值
})
obj.c = 3;
// 等同于
Object.defineProperty(obj,"c",{
value:3,
writable : true,
configurable : true,
enumerable : true
})
1.enumerable(o.propertyIsEnumerable(属性名),该方法用于判断该属性是否可以被遍历到)
enumerable.png
2.configurable
configurable.png
3.writable
writable.png
4.get、set
function Archiver(){
var temperature = null;
var archive = [];
Object.defineProperty(this,'temperature',{
get:function(){
console.log('get!');
return temperature;
},
set:function(value){
temperature = value;
archive.push({val:temperature});
}
});
this.getArchive = function(){
return archive;
}
}
var arc = new Archiver();
arc.temperature; // get!
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive() // [{ val: 11 }, { val: 13 }]
// 继承
var pattern = {
get: function () {
return 'I alway return this string,whatever you have assigned';
},
set: function () {
this.myname = 'this is my name string';
}
};
function TestDefineSetAndGet() {
Object.defineProperty(this, 'myproperty', pattern);
}
var instance = new TestDefineSetAndGet();
instance.myproperty = 'test';
console.log(instance.myproperty); // 'I alway return this string,whatever you have assigned'
console.log(instance.myname); // 继承属性,'this is my name string'
网友评论