Невозможно понять, как получить доступ к «расширенным» свойствам дочернего объекта из обратного вызова в родительском объекте. Мои две попытки ниже. Я хотел бы, чтобы функция «say_something» оповещала «скажи привет», где «привет» происходит от ребенка. Вместо этого он говорит «скажи неопределенный».
Попытка 1: я создаю объект «а», а затем создаю новый объект «б», производный от него. Но обратный вызов в «a» (здесь из setTimeout) не будет иметь доступа к правильному «this».
var a = {};
a.say_something = function () { setTimeout( function () { alert( "say " + this.text ); }, 0 ); };
var b = Object.create( a );
b.text = "hi";
b.say_something(); // alerts "say undefined"
Попытка 2: Распространенная мудрость гласит, что необходимо перестроить, чтобы учесть «ту» переменную, к которой можно получить доступ в обратном вызове. Но в отличие от «this», «that» не может получить доступ к свойствам из «b»:
var a = ( function () {
var that = {};
that.say_something = function () { setTimeout( function () { alert( "say " + that.text ); }, 0 ); };
return that;
}() );
var b = ( function () {
var that = Object.create( a );
that.text = "hi";
return that;
}() );
b.say_something(); // alerts "say undefined"
PS, я использую функцию Object.create Дугласа Крокфорда вместо (смущает меня) new (). Копируется здесь:
if ( typeof Object.create !== "function" ) {
Object.create = function ( o ) {
function F() {}
F.prototype = o;
return new F();
};
}