Я думаю, что вас смущает именно то, откуда на самом деле исходит "это".Так что потерпите меня - вот очень краткое объяснение, которое, я надеюсь, прояснит это.
В JavaScript то, на что «это» ссылается в функции, всегда определяется во время вызова функции.Когда вы делаете:
jimmy.nap ();
Функция nap (метод) запускается и получает jimmy как "this".
Какие объекты имеют ссылки на napне имеет значения.Например:
var jimmy = {}, billy = {};
jimmy.nap = function(){ alert("zzz"); };
var jimmy_nap = jimmy.nap;
jimmy_nap(); // during this function's execution, this is *NOT* jimmy!
// it is the global object ("window" in browsers), which is given as the
// context ("this") to all functions which are not given another context.
billy.sleep = jimmy.nap;
billy.sleep(); // during this function's excution, this is billy, *NOT* jimmy
jimmy.nap(); //okay, this time, this is jimmy!
Другими словами, всякий раз, когда у вас есть:
var some_func = function(arg1, arg2){ /*....*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(2, 3);
other_obj.some_meth(2, 3);
Во что это «переводится» (не буквально - это педагогически, а не о том, как интерпретаторы JavaScript)на самом деле работает вообще) это что-то вроде:
var some_func = function(this, arg1, arg2){ /* ...*/ };
// let's say obj and other_obj are some objects that came from somewhere or another
obj.some_meth = some_func;
other_obj.some_meth = some_func;
obj.some_meth(obj, 2, 3);
other_obj.some_meth(other_obj, 2, 3);
Итак, обратите внимание, как расширение используется в примере на этой странице:
UniversityPerson = Person.extend({ /* ... */ });
Проверка вопроса: когда расширяется, что делаетэто думает "это" относится к?Ответ: это верно.«Персона».
Значит, загадочный код на самом деле такой же, как (в данном конкретном случае):
var prototype = new Person('no_init');
Уже не так таинственно, а?Это возможно, потому что, в отличие от некоторых языков, переменная JavaScript, в том числе «this», может содержать любое значение, включая такую функцию, как Person.
(Нет ничего, что делает Person конкретно конструктором. ЛюбойФункция может быть вызвана с новым ключевым словом. Если я вспоминаю точную семантику, я думаю, что когда функция вызывается с новым ключевым словом, ей автоматически присваивается пустой объект ({}) в качестве контекста («this»)и когда функция возвращается, возвращаемое значение является тем же объектом, если (возможно?) функция не возвращает что-то еще)
Это крутой вопрос, потому что он говорит с довольно важной частью аккуратности или странности JavaScript (в зависимости ото том, как вы это видите).
Это отвечает на ваш вопрос?Я могу уточнить, если это необходимо.