Я думал, что понял понятие объекта прототипа JavaScript, а также [[первичный]], пока я не видел, что несколько сообщений расценили наследование классов.
Во-первых, "ООП JavaScript - умный путь" по http://amix.dk/blog/viewEntry/19038
Посмотрите раздел реализации:
var parent = new this('no_init');
И также "Простое Наследование JavaScript" на большом блоге John Resig.
var prototype = new this();
Что делает new this();
на самом деле средний?
Этот оператор не имеет никакого смысла мне, потому что мой понимать был этим this
точки к объекту и не функции конструктора. Я также попытался тестировать операторы в Firebug для понимания этого и всего, что я получаю, синтаксические ошибки.
Моя голова ушла в полное вращение.
Кто-то мог объяснить это подробно?
AJS.Class
эффективно * переводит это:
var Person = new AJS.Class({
init: function(name) {
this.name = name;
Person.count++;
},
getName: function() {
return this.name;
}
});
Person.count = 0;
в это:
var Person = function (name) {
this.name = name;
Person.count++;
};
Person.prototype = {
getName: function() {
return this.name;
}
};
Person.extend = AJS.Class.prototype.extend;
Person.implement = AJS.Class.prototype.implement;
Person.count = 0;
Следовательно, в этом случае this
в AJS.Class.prototype.extend
относится к Человеку
, потому что:
Person.extend(...);
// is the same as
Person.extend.call(Person, ...);
// is the same as
AJS.Class.prototype.extend.call(Person, ...);
* Я не перехожу к множеству случаев; это переписано для простоты понимания проблемы.
Я думаю, что вас смущает именно то, откуда на самом деле "это" исходит. Так что терпите меня - вот очень краткое объяснение, которое, я надеюсь, прояснит.
В JavaScript то, что «this» относится к функции, всегда определяется во время вызова функции. Когда вы это сделаете:
jimmy.nap ();
Функция (метод) nap запускается и принимает jimmy как «this».
Какие объекты имеют ссылки на сон, не имеет значения. Например:
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);
Итак, обратите внимание, как extension используется в примере на этой странице:
UniversityPerson = Person.extend({ /* ... */ });
Популярная викторина: когда выполняется extension, что, по его мнению, относится к "this"? Ответ: Верно. "Человек".
Итак, загадочный код выше действительно такой же, как (в данном конкретном случае):
var prototype = new Person('no_init');
Не так уж и загадочен, а? Это возможно, потому что, в отличие от некоторых языков, переменная JavaScript, включая this, может содержать любое значение, включая функцию, например Person.
(Ничто не делает Person конкретно конструктором. Любая функция может быть вызвана с помощью ключевого слова new.Если я вспомню точную семантику, я думаю, что когда функция вызывается с новым ключевым словом, ей автоматически предоставляется пустой объект ({}) в качестве контекста ("this"), а когда функция возвращается, возвращаемое значение это тот же самый объект, если (возможно?) функция не вернет что-то еще)
Это крутой вопрос, потому что он говорит о довольно важной части аккуратности или необычности JavaScript (в зависимости от того, как вы это видите).
Это ответ на ваш вопрос? Могу уточнить при необходимости.
см. Эту ссылку http://www.quirksmode.org/js/this.html Он расскажет вам об этом ключевом слове, но я не уверен, что это (), может быть его какая-то функция, определяемая пользователем ... о которой вы не знаете ...
«это» означает контекст выполняемой в данный момент функции.
Код, который вы публикуете, обязательно появляется в функции, которая действует как метод для объекта. Итак, объект - это контекст функции.
«new this ()» вернет клон текущего объекта после выполнения его функции-конструктора с переданными аргументами.
this () относится к функции, в которой находится код, но this () должен находиться внутри этой функции. Вызов нового this (); внутри функции создаст бесконечный цикл. Вызов его вне функции был бы излишним, потому что нет функции / класса, установленного как this ().