О звонке:
Вы можете решить эту проблему, используя .call()
, которая:
- должен вызываться для функции
addName.call()
- вы передаете ему объект того, кем вы хотите быть "этим"
addName.call({"name" : 'angela'});
- вы можете передать дополнительные аргументы, которые можно использовать в функции, для которой она вызывается
addName.call({"name": "angela"}, true);
, где, возможно, addName
принимает аргумент логического append
.
Использовать звонок:
Для этой конкретной проблемы мы можем передать «родительский» объект через call
, чтобы переопределить this
, обычно присутствующий в дочернем объекте.
Сначала посмотрите на нашу проблему
var app = {
init: function() {
var _this = this; // so we can access the app object in other functions
$('#thingy').click(function(){
alert(_this.options.thingy());
});
$('#another').click(function(){
alert(_this.options.getAnother());
});
},
options: {
thingy: function() {
// PROBLEM: the this here refers to options
return this.getThingy();
},
getAnother: function() {
// PROBLEM 2: we want the this here to refer to options,
// but thingy will need the parent object
return 'another ' + this.thingy();
},
},
getThingy: function() {
return 'thingy';
}
};
Теперь вот вызов использования решения
И JSFIDDLE чтобы увидеть, как это работает.
var app = {
init: function() {
var _this = this; // so we can access the app object in other functions
$('#thingy').click(function(){
// SOLUTION: use call to pass _this as the 'this' used by thingy
alert(_this.options.thingy.call(_this));
});
$('#another').click(function(){
// SOLUTION 2: Use call to pass parent all the way through
alert(_this.options.getAnother.call(_this));
});
},
options: {
thingy: function() {
// SOLUTION in action, the this is the app object, not options.
return this.getThingy();
},
getAnother: function() {
// SOLUTION 2 in action, we can still access the options
// AND pass through the app object to the thingy method.
return 'another ' + this.options.thingy.call(this);
},
},
getThingy: function() {
return 'thingy';
}
};
В заключение
Вы можете использовать .call()
всякий раз, когда вы используете метод для свойства вашего основного объекта: app.options.someFunction(arg)
всегда должен вызываться с .call
- app.options.someFunction.call(this, arg);
- таким образом вы можете быть уверены, что у вас всегда будет доступ к каждой части объекта. Это может дать вам доступ к методам другого свойства, таким как app.helpers.anotherFunction()
.
Хорошая идея в somefunction
, хранить this
в переменной _parentThis
, поэтому очевидно, что отражает this
.