我知道如何做到这一点的唯一方法是使变量非私有,但有两个例子,第二个更简洁:
(function testInheritance(global, doc) {
"use strict";
var MyFunc = Object.create({}, {
_foo: {
value: "Some Default Value",
writable: true,
enumerable: true
},
foo: {
get: function() {
return this._foo;
},
set: function(value) {
this._foo = value;
}
}
}),
testFunc = Object.create(MyFunc);
console.log(testFunc.foo); // "Some default value"
testFunc.foo = "boo";
console.log(testFunc.foo); // "boo";
testFunc._foo = "Not a private variable anymore";
console.log(testFunc.foo); // "Not a private variable anymore"
}(window, document));
(function testInheritanceTwo(global, doc) {
"use strict";
var MyFunc = Object.create({}, {
foo: {
get: function() {
if (!this._foo) {
return "Some default value set by the getter.";
}
return this._foo;
},
set: function(value) {
this._foo = value;
}
}
}),
testFunc = Object.create(MyFunc);
console.log(testFunc.foo); // "Some default value set by the getter."
testFunc.foo = "Whomp";
console.log(testFunc.foo); // "Whomp";
testFunc._foo = "Not a private variable anymore, unfortunately.";
console.log(testFunc.foo); // "Not a private variable anymore"
}(window, document));
据我所知:
您不能使用与您在 set: function(value) 中使用的名称相同的名称引用该值,否则您最终会陷入无限循环,其中设置值调用设置值,然后再次调用自身,依此类推。因此,你的问题。
如果您尝试将变量 _foo 设为私有,则 setter 不起作用。使用这种语法,您似乎可以隐藏变量,但不能真正将其设为私有。