Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中有一个getter和一个同名函数_Javascript_Oop - Fatal编程技术网

在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(对不起,我现在对自己很满意)-虽然我从来没有使用过它,但从理论上讲,它是可能的。我现在就走开,这是可以做到的,检查我的答案,但我实现它的方式是,无论你怎么看,一个讨厌的黑客,没有任何好处。完全相反,我选择做,检查我的答案,但我实现它的方式是,无论你怎么看,一个讨厌的黑客,没有任何好处。恰恰相反,我认为你是对的。这样做的代价是在未来成为一个地狱。我会把你标记为被接受的答案,因为