我真的想要打破制定者和吸气者来理解他们。 我认为如果有条件,可以使用setter:
var Temperature = {}
Temperature.closure = null
var init = {}
init.get = function() {
return this.closure
}
Object.defineProperty(Temperature, "b", init)
init = {}
init.set = function(arg) {
if (arg > -459.67) { // sanity check to make sure it's above 0 degrees Kelvin
this.closure = arg
}
}
Object.defineProperty(Temperature, "c", init)
console.log(Temperature.b); // null
Temperature.c = 32;
console.log(Temperature.b); // 32
Temperature.c = -5000
console.log(Temperature.b); // still 32

我想做的就是摆脱.b和.c以便我可以说
Temperature = 32
或
console.log(Temperature)
答案 0 :(得分:5)
tl;博士:你不能。
要使用setter和getter,你需要拥有某种属性。如果您使用带有var
,let
或const
的本地范围变量,您将无法附加(等于)一个用于覆盖变量的侦听器,因为变量本身是完全被新参考替换。
作为局部变量的替代方案:
如果您在对象的上下文中使用Temperature
,则可以选择通过this.temperature
而不是本地范围的变量来使用该对象的属性。
如果您坚持使用局部变量,可以考虑构建一个更复杂的Temperature
对象,该对象具有设置值的属性,但也有valueOf
方法可以转换为数字:
function Temperature(kelvin) {
this._internalValue = kelvin || 0;
}
Temperature.prototype = {
get kelvin() {...}
set kelvin(val) {...}
get celsius() {...}
set celsius(val) {...}
get farenheit() {...}
set farenheit(val) {...}
valueOf: function () {
return this._internalValue;
}
}
您仍然需要使用属性进行分配:
var temperature = new Temperature();
temperature.celsius = 0;
但您可以直接从对象中获取数值:
console.log(+temperature);
// ^ cast to a Number
答案 1 :(得分:0)
var obj = {
get temperature() {
return this.value
}
,set temperature(arg) {
if (arg > -459.67) {
this.value = arg
}
}
}
obj.value = null
console.log(obj.temperature) // null
obj.temperature = Math.PI
console.log(obj.temperature) // 3.141592653589793
obj.temperature = -5000
console.log(obj.temperature) // 3.141592653589793