我真的试图打破选手和吸气者来理解他们.我认为如果有条件,可以使用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 32Run Code Online (Sandbox Code Playgroud)
我想要做的是摆脱.b和.c以便我可以说
Temperature = 32
Run Code Online (Sandbox Code Playgroud)
要么
console.log(Temperature)
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您仍然需要使用属性进行分配:
var temperature = new Temperature();
temperature.celsius = 0;
Run Code Online (Sandbox Code Playgroud)
但是你可以直接从对象中获取数值:
console.log(+temperature);
// ^ cast to a Number
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |