JS Object.defineProperty Configurable,Enumerable,Writable,Value,Getter,Setter属性

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(); 返回一个实例;

猜你喜欢

转载自blog.csdn.net/Vincent_Field/article/details/83046516