VS 2010 - Как я могу получить IntelliSense JavaScript в моих методах-прототипах для this.Bar переменных? - PullRequest
4 голосов
/ 29 декабря 2010

Пример кода:

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

Я бы хотел получить понимание Intellisense this.bar внутри метода-прототипа Foo.baz.

Это ограничение IDE?Есть ли обходной путь?Должны ли мои конструкторы объектов делать что-то еще?

Ответы [ 2 ]

1 голос
/ 02 июля 2011

Я знаю, что вопрос старый, но этот шаблон хорошо работает для меня с Intellisense, я вижу все методы, добавленные с расширением, или другим способом. 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
    }
});
1 голос
/ 29 декабря 2010

Я нашел один обходной путь - которым я не очень доволен

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

Недостатками этого является гораздо больше ненужного кода - и я действительно не понимаю, почемукласс всегда должен быть вынужден использовать методы доступа для своих приватных переменных.

Примечание. Попытка получить однофункциональный метод Getter / Setter также никуда меня не привела

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(); 
}
...