0

我需要做出改变,但在一段时间内继续提供向后兼容性,但我不知道如何实现这一点。

我有一个像这样的对象:

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() 但我找不到可行的解决方案来使当前方式 (MyObject.myVar) 兼容除了转向类似函数的getter。

4

4 回答 4

3

不,这是不可能的。在javascript中,没有and的概念fieldsmethods只有property对象的概念,无论属性是值还是函数(函数也是对象。)

如果MyObject.myVar不是函数,MyObject.myVar()则将产生错误。

你唯一能做的就是拥有两个属性。

MyObject.myVar

MyObject.getMyVar()
于 2012-08-09T10:48:00.060 回答
1

这是不可能的,因为它会模棱两可。如果执行 getter 返回的对象MyObject.myVar,则调用 getter 。()因此,因为MyObject.myVar()当 getter 存在时有意义,所以无法为解释器决定您要调用您的函数。

于 2012-08-09T10:48:30.547 回答
1

可能的,虽然你的代码看起来很讨厌。由于函数是对象,因此它们也具有valueOf属性。通过使用对方法本身的引用来覆盖它来利用它,你就在那里:

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

这可能会导致许多令人讨厌的错误,可能会让您抓挠头发,直到没有头发可以抓挠。更不用说可能最终维护您的代码的其他人!

于 2012-08-09T10:53:55.970 回答
1

我想这行得通:

  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

http://jsfiddle.net/XS7fU/2/

于 2012-08-09T11:07:16.137 回答