Javascript 与二传手和接球手合作
我真的试图打破二传手和传接手的习惯来理解他们。 我认为,如果存在以下条件,可以使用setter: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
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。