Это потому, что ваша response
функция не фактически вызвана для вашего TestObject
объекта.
Вы видите, что в JavaScript функции не связаны строго с такими объектами, как вывидел бы в C ++, C #, Java или почти любом другом языке.Вместо этого функции на самом деле являются отдельными объектами, существующими сами по себе, и у них есть это интересное свойство, которое вы можете вызывать любой функцией для любого объекта.
Например:
var obj1 = { Prop1: "Property 1 Value!" };
var obj2 = { Prop2: "Property 2 Value!" };
var myFunc = function() { alert( "Prop1 = " + this.Prop1 + ", Prop2 = " + this.Prop2 ); };
obj1.fn = myFunc; // Assign myFunc to property obj1.fn
obj1.fn(); // Call myFunc with this=obj1
// Similarly for obj2:
obj2.somename = myFunc;
obj2.somename();
Вывод будет:
Prop1 = Property1 Value!, Prop2 = undefined
Prop1 = undefined, Prop2 = Property 2 Value!
Видишь, что я здесь сделал?Функция myFunc
существует сама по себе, не привязанная к какому-либо конкретному объекту.И я назначаю его свойствам различных объектов.
И функция - это значение - как, скажем, строка или целое число.Я могу сделать это:
var str = "Some String";
obj1.someprop = str;
И так же легко я могу сделать это:
var myFunc = function() {}
obj1.someotherprop = myFunc;
Теперь, когда значение некоторого свойства какого-либо объекта является функцией, вы можете вызватьэта функция, и она будет вызываться для этого объекта - это означает, что this
будет ссылкой на этот объект.Но если вы вызываете ту же функцию без использования префикса obj1.
, не будет вызываться для этого объекта.Пример:
var obj1 = {};
obj1.Prop = "Value";
obj1.Func = function() { alert( this.Prop ); }
obj1.Func(); // Displays "Value"
var f = obj1.Func;
f(); // Displays "undefined"
Возвращаясь к исходной проблеме: ваша проблема в том, что ваша response
функция не вызывается для вашего TestObject
объекта.Следовательно, вы должны сохранить ссылку на этот объект в локальной переменной и использовать ее вместо this
.Вот так:
function TestObject()
{
this.name = ""; //public
var xhr = null; //private
var _this = this;
var response = function() //private
{
if(xhr.readyState > 3)
{
alert("B: my name is " + _this.name);
}
}