Object.defineProperty使用
使用Object.defineProperty方法可以给类的实例添加属性或方法,该方法有两种传参组合,对应两种不同的效果。假设,我们需要给Date的所有实例添加p熟悉,可使用下面两种方式:
常规方法
Object.defineProperty(Date.prototype, "p", {
value: 4,
enumerable: false,
configurable: true,
writable: true
});
参数解释
Date.prototype后面那个参数,表示属性名
value:属性默认值
enumerable:是否可通过for-in循环,flase为不可循环,默认值为true
configurable:是否可调用defineProperty改变定义特性,默认值为true
writable:是否可改变值,默认值为true。为false时,假设date变量为Date类的实例,那么此时改变值的语句如:date.p = 6、delete date.p 不生效
通过get/set方法
假设p1参数已经存在过
Object.defineProperty(Date.prototype, "p2", {
enumerable: false,
configurable: true,
get: function() {
return this.p1;
},
set: function(v) {
this.p1 = v;
}
});
参数解释
enumerable:同上
configurable:同上
get:获取值的函数,通过该函数可返回需要的值(注意:如果变量名为p2,那么函数内部不要含有this.p2的取值调用,否则会无限递归)。假设date变量为Date类的实例,那么此时var p = date.p2实际是调用的get方法
set:设置值的函数,通过该函数可设定值(注意点同理)。假设date变量为Date类的实例,那么此时date.p2 = 3实际是调用的set方法
在get和set模式下,实际上writable介于true和false之间,改变值的语句date.p = 4能够生效,而语句 delete date.p 不生效。defineProperty函数,参数writable、value不能与get、set同时存在。
通过Object.defineProperty(Date.prototype, name, opt)可以给类的实例添加属性和方法。而通过Object.defineProperty(Date, name, opt)可以给类添加静态熟悉和方法,如:Object.defineProperty(Date, "getInstance", {enumerable: false, configurable: true, value: function() {return new Date();} }); ,此时可这样调用函数 var date = Date.getInstance(); 返回一个实例;
————————————————
版权声明:本文为CSDN博主「Vincent_Field」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vincent_field/article/details/83046516
网友评论