2010-12-29 14 views
3

コード例:VS 2010 - this.Bar変数のプロトタイプメソッドでJavaScript Intellisenseを取得するにはどうすればよいですか?

function Foo(){ 
    this.bar = "12345"; 
    //Intellisense works on this.bar 
} 

Foo.prototype.baz = function(){ 
    var bob = "12345"; 
    //Intellisense works on bob 
    //Intellisense does not work on this.bar 
} 

var f = new Foo(); 
//Intellisense works on f.bar 
//Intellisense works on f.baz 

私はFoo.bazプロトタイプメソッド内インテリセンス理解this.barを取得したいのですが。

これはIDEの制限ですか?回避策はありますか?私のオブジェクトコンストラクタは他の何かをするべきですか?私は1つの回避策を作ってみた

答えて

1

- 私は

function Foo(){ 
    this._bar = "12345"; 
    //Intellisense works on this.bar 
} 

Foo.prototype.setBar = function(bar){ 
    /// <param name="bar" type="String"/> 
    if(bar){ 
     this._bar = bar; 
    } 
} 
Foo.prototype.getBar = function(){ 
    /// <returns type="String"/> 
    return this._bar; 
} 

Foo.prototype.baz = function(){ 
    var bob = "12345"; 

    //Intellisense works on bob 
    //Intellisense works on this.getBar(); 
} 

これの欠点にはとても満足していないよ、多くの不要なコードである - そして、なぜクラス私は本当に見ていませんそのプライベート変数に常にアクセッサを使用する必要があります。

注 - 単機能ゲッター/セッターを持ってしようとすると、どこにでも

Foo.prototype.bar = function(bar){ 
    // If a value is passed, set this._bar and return, otherwise, act as a getter 
    if(bar){ 
     this._bar = bar; 
    } 
    return this._bar; 
} 
Foo.prototype.baz = function(){ 
    //Valid Javascript, Intellisense works 
    this.bar("12345"); 

    //Valid Javascript, Intellisense does not work 
    //VS seems to do parameter checking... 
    this.bar(); 
} 
1

のいずれかを、私を取得していない私ができる、私は質問が古いですけど、このパターンはインテリセンスと私のために良い取り組んでいます拡張などで追加されたすべてのメソッドを参照してください。 jQueryはこれと同様のパターンを使用していますが、まだ実行しているかどうかわかりません

var Foo = function (str) { 
    return new Foo.fn.__construct(str); 
}; 

// fn is just shorter than prototype 
Foo.fn = Foo.prototype = { 
    __construct: function (str) { 
     // Intialization 
     this.bar = "12345"; 
     // absolutely works 
    }, 
    bar: "", 
    extend: function (objectLiteral) { 
     // Add to the prototype 
     for (var k in objectLiteral) { 
      this[k] = objectLiteral; 
     } 
    } 
}; 

Foo.fn.__construct.prototype = Foo.fn; 
Foo.extend = Foo.fn.extend; 

Foo.fn.baz = function() { 
    this.bar; // Intelli Works! 
}; 
Foo.fn.extend({ 
    baz: function() { 
     this.bar; 
     // Intelli doesnt work 
    } 
});