Функции в JavaScript являются полноценными объектами. Они также, когда передаются в качестве аргумента другой функции, не сохраняют свою область видимости. Итак, в следующем коде ...
var obj1 = {
property1: "blah",
method1: function () {
alert(this.property1);
// do stuff
}
};
function func1 (passedFunction) {
passedFunction();
// do other stuff
}
func1(obj1.method1);
... func1
вызовет obj1.method1
, но не будет alert
значением obj1
property1
, потому что все, что мы сделали, это передали объект функции, а не ее this
контекст. Вот где приходят call
и apply
. Они позволяют вам вводить область видимости, сообщать функции, каково будет значение this
. Работает следующий пример:
var obj1 = {
property1: "blah",
method1: function () {
alert(this.property1);
// do stuff
}
};
function func1 (passedObject, passedFunction) {
passedFunction.call(passedObject);
// do other stuff
}
func1(ob1, obj1.method1);
Теперь мы принудительно или явно сказали obj1.method1
, что будет с его контекстом, вызвав call
и передав ему объект, который он будет использовать как this
.
call
и apply
практически идентичны, за исключением того, как они обрабатывают дополнительные аргументы для вызываемой функции. См. Эти статьи на MDN для получения дополнительной информации: вызов , применяются и Функция .
Все это было сказано, bb_graphics_GraphicsContext
- конструктор. (Что вы, вероятно, догадались.) Вы вызываете его, используя ключевое слово new
, var obj1 = new bb_graphics_GraphicsContext();
. Когда он достигает строки 1 функции, он берет объект this
и вызывает общий конструктор Object
, явно внедряя новый объект this
(в конструкторе bb_graphics_GraphicsContext
) в качестве this
Object
конструктор. Я бы предположил, что автор этой функции / конструктора делал это, чтобы убедиться, что вновь созданный объект в bb_graphics_GraphicsContext
получает все базовые методы из базы Object
. Но я не знаю, почему это было бы необходимо, так как если вы вызовете bb_graphics_GraphicsContext
с ключевым словом new
, все эти свойства будут получены естественным путем.