与安装者和吸气剂一起工作

时间:2016-05-24 17:12:48

标签: javascript

我真的想要打破制定者和吸气者来理解他们。 我认为如果有条件,可以使用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)

2 个答案:

答案 0 :(得分:5)

tl;博士:你不能。

要使用setter和getter,你需要拥有某种属性。如果您使用带有varletconst的本地范围变量,您将无法附加(等于)一个用于覆盖变量的侦听器,因为变量本身是完全被新参考替换。

作为局部变量的替代方案:

如果您在对象的上下文中使用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