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()

出来ますか?さらに良いことに、それを達成してクロスブラウザ互換にする可能性はありますか? (今のところ、Get 表記が Internet Explorer でサポートされていないことはわかっています)

ありがとう。

更新

無理そうなので、今持っているものをget myVar()Internet Explorer のブラウザ対応にする方法はありますか?したがって、すべてのブラウザがMyObject.myVarにアクセスできます

myVar に getter を提供し続けることができ、Internet Explorer と互換性がある限り、myVar() に移行する必要はありませんが、現在の方法 (MyObject.myVar) を互換性のあるものにする実行可能な解決策は見つかりませんでした。関数のようなゲッターに移行します。

4

4 に答える 4

3

いいえ、これは不可能です。fieldsプロパティが値であろうと関数であろうと、javascript にはandの概念はなく、オブジェクトmethodsのみpropertyです (関数もオブジェクトです)。

MyObject.myVarが関数でない場合MyObject.myVar()、エラーが発生します。

できることは、2 つのプロパティを持つことだけです。

MyObject.myVar

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

あいまいになるため、これは不可能です。ゲッターによって返されたオブジェクトが実行されたMyObject.myVar場合、ゲッターを呼び出します。()したがってMyObject.myVar()、ゲッターが存在する場合は意味があるため、代わりに関数を呼び出すことをインタープリターに決定することはできません。

于 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 に答える