Javascript 与二传手和接球手合作

Javascript 与二传手和接球手合作,javascript,Javascript,我真的试图打破二传手和传接手的习惯来理解他们。 我认为,如果存在以下条件,可以使用setter: var温度={} Temperature.closure=null var init={} init.get=函数(){ 把这个还给我 } 对象定义属性(温度,“b”,初始) init={} init.set=函数(arg){ 如果(arg>-459.67){//检查是否正常,以确保其高于0度开尔文 this.closure=arg } } 对象定义属性(温度,“c”,初始) console.lo

我真的试图打破二传手和传接手的习惯来理解他们。 我认为,如果存在以下条件,可以使用setter:

var温度={}
Temperature.closure=null
var init={}
init.get=函数(){
把这个还给我
}
对象定义属性(温度,“b”,初始)
init={}
init.set=函数(arg){
如果(arg>-459.67){//检查是否正常,以确保其高于0度开尔文
this.closure=arg
}
}
对象定义属性(温度,“c”,初始)
console.log(Temperature.b);//无效的
温度c=32;
console.log(Temperature.b);//32
温度c=-5000

console.log(Temperature.b);//仍然是32个
tl;博士:你不能

要使用setter和getter,您需要具有某个属性。如果将局部作用域变量与
var
let
const
一起使用,您将无法附加(相当于)用于覆盖变量的侦听器,因为变量本身将被完全替换为新引用


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

如果在对象的上下文中使用
Temperature
,则可以通过
this.Temperature
选择使用该对象的属性,而不是局部范围的变量


如果你坚持使用局部变量,你可以考虑建立一个更复杂的<代码>温度< /Cord>对象,该对象具有设置值的属性,但也有一个<代码>值> <代码>方法,用于转换为数值:

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

tl;博士:你不能

要使用setter和getter,您需要具有某个属性。如果将局部作用域变量与
var
let
const
一起使用,您将无法附加(相当于)用于覆盖变量的侦听器,因为变量本身将被完全替换为新引用


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

如果在对象的上下文中使用
Temperature
,则可以通过
this.Temperature
选择使用该对象的属性,而不是局部范围的变量


如果你坚持使用局部变量,你可以考虑建立一个更复杂的<代码>温度< /Cord>对象,该对象具有设置值的属性,但也有一个<代码>值> <代码>方法,用于转换为数值:

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
var obj={
获取温度(){
返回此.value
}
,设定温度(arg){
如果(arg>-459.67){
this.value=arg
}
}
}
obj.value=null
console.log(对象温度)//null
obj.temperature=Math.PI
console.log(对象温度)//3.141592653589793
目标温度=-5000
console.log(对象温度)//3.141592653589793
var obj={
获取温度(){
返回此.value
}
,设定温度(arg){
如果(arg>-459.67){
this.value=arg
}
}
}
obj.value=null
console.log(对象温度)//null
obj.temperature=Math.PI
console.log(对象温度)//3.141592653589793
目标温度=-5000

console.log(obj.temperature)//3.141592653589793
您希望
temperature=32
做什么?我想知道您的两个属性是否共享相同的
init
对象,这可能是一个问题。使用
defineProperty
时,可以(而且应该)直接向其传递一个对象文本:
object.defineProperty(温度,“b”,{get:function(){}})
@RocketHazmat它们不共享同一个对象。将值32指定给对象“温度”如果
Temperature
是另一个对象的属性,你可以这样做,即
c.Temperature=32
如果c为
Temperature
定义了getter/setter。除此之外,变量本身不是对象,您不能在变量上定义getter/setter(您将在上面声明它们什么?)。您希望
Temperature=32
做什么?我想知道您的两个属性是否共享相同的
init
对象,这可能是一个问题。使用
defineProperty
时,可以(而且应该)直接向其传递一个对象文本:
object.defineProperty(温度,“b”,{get:function(){}})
@RocketHazmat它们不共享同一个对象。将值32指定给对象“温度”如果
Temperature
是另一个对象的属性,你可以这样做,即
c.Temperature=32
如果c为
Temperature
定义了getter/setter。除此之外,变量本身不是对象,您不能在变量上定义getter/setter(您将在什么上声明它们?)。您感到困惑的是,在中,它们使用了b和c,而它们本应使用相同的名称。您感到困惑的是,当他们应该使用相同的名称时,他们使用了b和c。