我想在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(){
//....
}
答案 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
函数的附加参数提供。