以下脚本不起作用。什么是正确的方法?
function AnObject () {
get this.apple = () {
return this.apple + "GET";
}
set this.apple = ( newValue ) {
return newValue + "SET";
}
}
var obj = new AnObject();
obj.apple = "Lemon";
console.log( obj.apple ); // LemonSETGET
答案 0 :(得分:5)
您可以使用Object.defineProperties()
:
function AnObject() {
Object.defineProperties(this, {
apple: {
get: function() {
return this._apple + " GET";
},
set: function(value) {
this._apple = value;
},
configurable: true, writable: true
}
});
}
请注意,如果要直接保持对象的值,则必须小心使用其他属性名称。如果没有,你可以使用构造函数的闭包:
function AnObject() {
var theApple;
Object.defineProperties(this, {
apple: {
get: function() {
return theApple + " GET";
},
set: function(value) {
theApple = value;
},
configurable: true, writable: true
}
});
}
答案 1 :(得分:3)
添加到Pointy的......点,
您可以将getter和setter用作语言功能,方法是将它们放在Object Literals中。
您可以将原始构造函数转换为工厂,只需执行以下操作即可使用基于实例的getter和setter:
function makeAnObject () {
var hiddenApple = "Granny Smith";
return {
get apple () { return hiddenApple; },
set apple (ignore) { return hiddenApple; }
};
}
var thing = makeAnObject();
thing.apple;
thing.apple = "Crab Apple";
请记住,取决于getter / setter,在旧浏览器上会爆炸式爆炸(IE8在这里真的很棒),就这样使用了。
另外,在defineProperties
中使用它们可以防止IE8爆炸(因为它不再是语言构造)...... ... buuuut,它实际上并没有添加getter / setter,或者(即使使用polyfill将方法添加到Object,而不仅仅是DOM Elements),因此,由于语法爆炸,或者由于与其他浏览器完全不同,会产生错误行为。< / p>
这可能现在不适用于您,希望它永远不会... ......我们中的一些人仍然生活在那个可怕的现实中。
答案 2 :(得分:1)
class User {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
set fullName(newValue) {
[this.firstName, this.lastName] = newValue.split(' ');
}
};
let user = new User("AAAA", "BBBB");
alert( user.fullName );
user.fullName = "CCCC DDDD";
alert( user.fullName );
答案 3 :(得分:0)
JS中没有setter和getter
但你可以效仿它们
function AnObject () {
var apple = '';
this.get = function() {
return apple + "GET";
}
this.set = function( newValue ) {
apple = newValue + "SET";
}
}
var obj = new AnObject();
obj.set("Lemon");
console.log( obj.get() ); // LemonSETGET