Я вижу пару проблем с вашим кодом.Во-первых, ваша функция финиша - то, что вы делаете с переменной контекста - очень плохой стиль, а в Javascript есть функция, называемая замыканиями, которая поможет вам в этом разобраться.Ваш конструктор должен выглядеть примерно так:
function A() {
this.b = 13;
//this is how you should be storing contexts
var that = this;
function finish(response) {
that.b = response;
}
ajax(finish);
}
finish будет иметь доступ к этому даже после того, как конструктор A вернется.Кроме того, вам не нужен тот материал-прототип, который есть у вас под А.Он буквально ничего не делает.
Наконец, мы можем немного привести в порядок вашу AJAX-функцию, чтобы она выглядела так:
function ajax(callback) {
var http = new XMLHttpRequest();
var url = "phppage.php";
http.open("GET", url, true);
http.onreadystatechange = function() {
alert('a');
if(http.readyState == 4 && http.status == 200) {
callback(http.responseText);
}
}
http.send(null);
}
Обратите внимание, что это весь непроверенный код, поэтому нет никаких гарантий, что он будет работатьно я думаю, что это укажет вам правильное направление.
РЕДАКТИРОВАТЬ:
Теперь, когда я смотрю на ваш код, я понимаю, что он, вероятно, работает просто потому, что вы вызываете ajax асинхронно, так чтосразу возвращается, и вы выводите значение b, прежде чем получить его обратно.
может захотеть попробовать:
http.open("GET", url, false);
(но все мои комментарии выше все равно следует учитывать, поскольку онибудет действительно убирать вещи немного)