在javascript中有一个getter和一个同名函数
我需要做一些改变,但在一段时间内继续提供向后兼容性,但我不知道如何实现这一点 我有一个这样的物体:在javascript中有一个getter和一个同名函数,javascript,oop,Javascript,Oop,我需要做一些改变,但在一段时间内继续提供向后兼容性,但我不知道如何实现这一点 我有一个这样的物体: MyObject = (function() { // vars here and there var myVar // a bunch of code return { get myVar() { return myVar }, myVar: function() { return myVar } } }()) 这不管用。我想用这两种方
MyObject = (function() {
// vars here and there
var myVar
// a bunch of code
return {
get myVar() { return myVar },
myVar: function() { return myVar }
}
}())
这不管用。我想用这两种方法都能得到myVar
MyObject.myVar
及
MyObject.myVar()
可能吗?更好的是,有没有可能做到这一点,并使其跨浏览器兼容?(现在我知道Internet Explorer不支持get符号)
谢谢
更新:
因为这似乎是不可能的,有没有办法使我现在拥有的,get myVar()
浏览器与Internet Explorer兼容?
因此,所有浏览器都可以访问MyObject.myVar
只要我可以继续为myVar提供一个getter,并且它与Internet Explorer兼容,就没有必要移动到myVar(),但除了移动到像getter这样的函数之外,我找不到使当前方式(MyObject.myVar)兼容的可行解决方案。不,这是不可能的。在javascript中,没有
字段
和方法
的概念,只有对象的属性
,无论属性是值还是函数(函数也是对象)
如果MyObject.myVar
不是函数,则MyObject.myVar()
将产生错误
你唯一能做的就是拥有两个属性
MyObject.myVar
及
不,这是不可能的。在javascript中,没有
字段
和方法
的概念,只有对象的属性
,无论属性是值还是函数(函数也是对象)
如果MyObject.myVar
不是函数,则MyObject.myVar()
将产生错误
你唯一能做的就是拥有两个属性
MyObject.myVar
及
这是不可能的,因为这将是不明确的<代码>MyObject.myVar调用getter,如果后跟
()
则执行getter返回的对象。因此,因为当存在getter时,MyObject.myVar()
有一个含义,所以无法为解释器决定是否要调用函数。这是不可能的,因为它是不明确的<代码>MyObject.myVar调用getter,如果后跟()
则执行getter返回的对象。因此,因为当存在getter时,MyObject.myVar()
有一个含义,所以不可能为解释器决定您要调用函数。这是可能的,尽管您的代码看起来很糟糕。由于函数是对象,因此它们也具有值of
属性。通过使用对方法本身的引用覆盖它来利用该漏洞,您将:
var foo = (function()
{
var bar = 'foobar';
var r = {
bar:function()
{
return bar;
}
};
r.bar.toString = r.bar.valueOf = r.bar;//valueOf && toString invoke the method
return r;
})();
请注意,其类型将是相同的对象,因此严格的比较不起作用:
foo.bar =='foobar'//true
foo.bar === 'foobar'//false
alert(foo.bar+'');//alerts foobar
alert(foo.bar);//alerts foobar now, setting toString to reference the method, too
console.log(foo.bar());//foobar <= still works, and here strict comparisons do work
foo.bar=='foobar'//true
foo.bar==='foobar'//false
警报(食物棒+“”)//提醒foobar
警报(食物棒)//现在提醒foobar,并将toString设置为引用该方法
console.log(foo.bar())//foobar这是可能的,尽管您的代码看起来很糟糕。由于函数是对象,因此它们也具有值of
属性。通过使用对方法本身的引用覆盖它来利用该漏洞,您将:
var foo = (function()
{
var bar = 'foobar';
var r = {
bar:function()
{
return bar;
}
};
r.bar.toString = r.bar.valueOf = r.bar;//valueOf && toString invoke the method
return r;
})();
请注意,其类型将是相同的对象,因此严格的比较不起作用:
foo.bar =='foobar'//true
foo.bar === 'foobar'//false
alert(foo.bar+'');//alerts foobar
alert(foo.bar);//alerts foobar now, setting toString to reference the method, too
console.log(foo.bar());//foobar <= still works, and here strict comparisons do work
foo.bar=='foobar'//true
foo.bar==='foobar'//false
警报(食物棒+“”)//提醒foobar
警报(食物棒)//现在提醒foobar,并将toString设置为引用该方法
console.log(foo.bar())//foobar我想这是可行的:
function test() {
var myVar = 5;
return {
/*@cc_on
/*@if (@_jscript_version)
myVar: function() { return myVar }
@else @*/
get myVar() { return myVar }
/*@end
@*/
};
}
var a = test();
var b = a.myVar/*@cc_on () @*/
alert(b) // alerts 5
我想这是可行的:
function test() {
var myVar = 5;
return {
/*@cc_on
/*@if (@_jscript_version)
myVar: function() { return myVar }
@else @*/
get myVar() { return myVar }
/*@end
@*/
};
}
var a = test();
var b = a.myVar/*@cc_on () @*/
alert(b) // alerts 5
没有任何意义。为什么两者都要?只要使用一个函数,它就可以在任何地方工作。我不认为这是可能的…因为这是一种API,客户端现在正在使用MyObject.myVar.blabla(),但我们需要将所有客户端移动到MyObject.myVar().blablabla(),而这不会在一天内发生。这就是为什么我想同时支持两种方式,一种是当前的(MyObject.myVar),另一种是新的(MyObject.myVar())。@FelixKling排序:D没有任何意义。为什么两者都要?只要使用一个函数,它就可以在任何地方工作。我不认为这是可能的…因为这是一种API,客户端现在正在使用MyObject.myVar.blabla(),但我们需要将所有客户端移动到MyObject.myVar().blablabla(),而这不会在一天内发生。这就是为什么我想同时支持两种方式,一种是当前的(MyObject.myVar),另一种是新的(MyObject.myVar())。@FelixKling有点像:D这很好,但问题是我无法控制对myVar的调用,所以我不能把它放在:a.myVar/*@cc_on()@*/是的,但是值得一试:尽管这可能很有用。我不知道这件事。哦,这是一盒惊喜。无论如何谢谢你@我发现FelixKling(对不起,我现在对自己很满意)-虽然我从来没有使用过它,但从理论上讲,它是可能的。我现在要挂断了这很好,但问题是我无法控制对myVar的调用,所以我不能把它放在下面:a.myVar/*@cc_on()@*/是的,值得一试:尽管这可能很有用。我不知道这件事。哦,这是一盒惊喜。无论如何谢谢你@我发现FelixKling(对不起,我现在对自己很满意)-虽然我从来没有使用过它,但从理论上讲,它是可能的。我现在就走开,这是可以做到的,检查我的答案,但我实现它的方式是,无论你怎么看,一个讨厌的黑客,没有任何好处。完全相反,我选择做,检查我的答案,但我实现它的方式是,无论你怎么看,一个讨厌的黑客,没有任何好处。恰恰相反,我认为你是对的。这样做的代价是在未来成为一个地狱。我会把你标记为被接受的答案,因为