1 - точка добавления членов в прототип конструктора - это повторное использование поведения.
Все экземпляры объекта, которые наследуются от этого прототипа, смогут разрешить член через цепочка прототипов , также члены определены только один раз, а не в каждом экземпляре.
2- Это происходит потому, что каждая функция имеет свой собственный контекст выполнения (там хранится значение this
)и значение this
устанавливается неявно, когда вы вызываете функцию, а если ссылка на функцию не имеет базового объекта (например, foo();
, vs obj.foo()
), глобальный объект будет установлен какthis
значение внутри вызванного метода.
Подробнее см. Вторую часть этого ответа .
Редактировать: После просмотра кодаКажется, вы передаете ссылку на метод nextCallback
как функцию обратного вызова некоторого события успеха Ajax, если это так, базовый объект ссылки будет потерян, общий подход, который может заключаться в использовании анонииФункция mous, которая корректно вызывает ваш метод, например:
var obj = new Test();
//...
someAjaxLib(url, function (data) {
obj.nextCallback(data); // `this` will refer to obj within nextCallback
});
Другим подходом может быть привязка метода к его экземпляру в конструкторе, имейте в виду, что метод будет определен как собственное свойство в каждый экземпляр объекта , который вы создаете, не будет наследоваться, например:
function Test() {
var instance = this; // store reference to the current instance
this.nextCallback = function( response ) {
if( response.Status != 'SUCCESS' ) {
show_message( response.Message, false );
} else {
instance.setQuestion( response.Question ); // use the stored reference
}
}
}