Funciones en JavaScript son objetos de pleno derecho. También, cuando se pasan como argumento para otra función, no retienen su alcance. Así, en el siguiente código ...
var obj1 = {
property1: "blah",
method1: function() {
alert(this.property1);
// do stuff
}
};
function func1 (passedFunction) {
passedFunction();
// do other stuff
}
func1(obj1.method1);
... func1
llamarán obj1.method1
, pero no va a alert
el valor de obj1
's property1
, porque todo lo que hemos hecho es pasar el objeto función, no es su contexto this
. Ahí es donde entran call
y apply
. Permiten inyectar alcance, decirle a la función cuál será el significado de this
. El siguiente ejemplo funciona:
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);
Ahora, hemos forzado o dice explícitamente obj1.method1
lo hará su contexto invocando call
, y pasándole el objeto es para su uso como this
.
call
y apply
son casi idénticos, excepto por cómo manejan argumentos adicionales a la función invocada. Consulte estos artículos en MDN para obtener más información: call, apply y Function.
Dicho todo esto, bb_graphics_GraphicsContext
es un constructor. (Que probablemente haya adivinado). Invoquelo utilizando la palabra clave new
, var obj1 = new bb_graphics_GraphicsContext();
. Cuando alcanza la línea 1 de la función, toma el objeto this
y llama al constructor genérico Object
, que inyecta explícitamente el nuevo objeto this
(en el constructor bb_graphics_GraphicsContext
) como this
del constructor Object
. Supongo que el escritor de esta función/constructor estaba haciendo esto para asegurarse de que el objeto recién creado en bb_graphics_GraphicsContext
obtenía todos los métodos básicos de la base Object
. Pero no sé por qué sería necesario, como si llamara al bb_graphics_GraphicsContext
con la palabra clave new
, captará todas estas propiedades de forma natural.
Es posible que desee dejar en claro que se pregunta por qué, en particular, un constructor (esta función "bb_graphics_GraphicsContext") haría eso con su propia referencia 'this'. – Pointy
Se consideró que era constructor. Pero si es así, tiene que llamar fuera de la función. – miqbal
Agregué comentarios adicionales al final de mi respuesta para ver lo que hace, y ofrezco reflexiones sobre por qué se hizo. –