javascript - 使用 setter 和 getter

标签 javascript

我真的很想分解 setter 和 getter 来理解它们。 我认为如果有条件就可以使用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)

最佳答案

tl;dr:你不能。

要使用 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

关于javascript - 使用 setter 和 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37419930/

相关文章:

javascript - Meteor App在表单中获取textarea的值

javascript - 不是函数?

javascript - 按子属性(可能缺失)对对象的 javascript 数组进行排序

javascript - 更新对象数组中一个对象的一个​​属性值,返回更新后的数组

javascript - 有没有办法等待 AJAX 响应并停止执行?

javascript - jQuery 中的可重用幻灯片

javascript - 函数未定义,但我已经定义了它

javascript - 如何在 while 循环中为每个 div 创建一个 ID 并使用 JQuery 发出警报

javascript - jQuery-UI slider 背景

javascript - 使用 slideDown()/slideUp() 进行水平溢出