Обновленный ответ :
document.write(o1.method.call(o2)); // Returns nay, but I need "yay" here
Вы сказали, что уже отсортировали его, но как ответ на , который на самом деле не показан здесь на SO, я подумал, что я также могу обновить, чтобы показать это.
Если это method
, вы хотите иметь доступ me
, даже если он был вызван с другим значением this
, вы должны определить его как getThis
, как закрытие над me
:
function Obj1() {
var me = this;
this.something = "yay";
this.method = function() {
return me.something;
};
this.getThis = function(){
return me;
};
}
function Obj2() {
this.something = "nay";
}
Obj2.prototype.method = function() {
return this.something;
};
... или, конечно, если вам не нужно, чтобы «что-то» было свойством объекта, просто сделайте его переменным внутри конструктора ( закрытая переменная , например, * 1024). *):
function Obj1() {
var me = this;
var something = "yay";
this.method = function() {
return something;
};
this.getThis = function(){
return me;
};
}
function Obj2() {
this.something = "nay";
}
Obj2.prototype.method = function() {
return this.something;
};
Оригинальный ответ : (К пересмотру 1 вопроса, в котором не было me
.)
но я подумал, что при создании замыкания (как я это делаю в 4) Javascript должен сохранить «this».
this
устанавливается полностью в зависимости от того, как вызывается функция, а не от того, где она определена; подробнее об этом здесь и здесь . Но, как вы определили свою getThis
функцию, вы можете использовать тот факт, что она закрывается над вызовом конструктора, чтобы решить эту проблему (без каламбура) без использования this
:
function Obj1() {
var me = this; // <== Use a variable to remember `this`
this.something = "yay";
this.method = function() {
return this.something;
};
this.getThis = function(){
return me; // <== Return it
};
}
Живой пример
Подробнее о затворах и трубопроводах, благодаря которым вещь me
работает здесь .
Это связано с затратами, и, как правило, с вашим шаблоном определения функций в функции конструктора: каждый отдельный объект, созданный Obj1
и Obj2
, получает собственный копия каждой функции. Это может иметь последствия для памяти, если вокруг много таких объектов (но если у вас их много, вам не о чем беспокоиться, и вы получите такие преимущества, как me
вещь и другие частные переменные ). В отличие от этого, если вы используете функцию, назначенную прототипу, все экземпляры будут использовать одну общую копию функции.
В вашем примере кода действительно нужно дублировать только функцию getThis
для каждого экземпляра (потому что вы полагаетесь на замыкание), так что вы можете сделать это, чтобы избежать ненужного распространения функции:
function Obj1() {
var me = this;
this.something = "yay";
this.getThis = function(){
return me;
};
}
Obj1.prototype.method = function() {
return this.something;
};
function Obj2() {
this.something = "nay";
}
Obj2.prototype.method = function() {
return this.something;
};