一个类里面的JS getter和setter?

时间:2014-02-04 22:27:55

标签: javascript setter getter getter-setter

我想在JS中创建一个使用本机getter和setter的类。我知道我可以为对象创建getter / setter,如下所示:

var obj = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val;
    }
}

我也知道我可以在类/函数中使用this.__defineGetter__,但是MDN说使用__defineGetter__()等会被弃用。

有没有更好的方法将getter和setter添加到js类而不是:

function class(){
};

class.prototype = {
   get value(){
        //....

}

3 个答案:

答案 0 :(得分:8)

在类上定义属性的最简洁方法是Object.defineProperties。这允许您在一个易于阅读的块中定义所有属性。这是一个例子:

var MyClass = function() {
    this._a = undefined;
    this._b = undefined;
};

Object.defineProperties(MyClass.prototype, {
    //Create a read-only property
    a : {
        get : function() {
            return this._a;
        }
    },
    //Create a simple read-write property
    b : {
        get : function() {
            return this._b;
        },
        set : function(value) {
            this._b = value;
        }
    }
});

定义属性时有很多其他选项,因此请务必查看我发布的链接以获取更多信息。同样重要的是要记住,即使是最基本的getter / setter属性也只能与当前浏览器中的方法调用一样快,因此它们可能成为性能密集型情况的瓶颈。

答案 1 :(得分:2)

2019:ES6的万岁!

class Person {
    
    get name() {
        return this._name + '!!!'
    }

    set name(newValue) {
        this._name = newValue
    }

    constructor(name) {
        this._name = name
    }
}

const me = new Person('Zach')
console.log(me.name)            // Zach!!!

me.name = 'Jacob'
console.log(me.name)            // Jacob!!!

// Of course, _name is not actually private.
console.log(me._name)           // Jacob

答案 2 :(得分:-2)

这个实现怎么样:

function makeObject(obj, name) {
    // The property
    var value;

    // The setter
    obj["get" + name] = function() {return value;};

    // The getter
    obj["set" + name] = function(v) {
        value = v;
    };
}

进行实验:

var obj = {};
makeObject(obj, "Name");
obj.setName("Lolo");
print(obj.getName());

当然,您可以先测试name的有效性,然后再将其存储在value中。该测试可作为makeObject函数的附加参数提供。