Путание оператора JavaScript: “var x = новый это ()”;

Я думал, что понял понятие объекта прототипа 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 для понимания этого и всего, что я получаю, синтаксические ошибки.

Моя голова ушла в полное вращение.

Кто-то мог объяснить это подробно?

16
задан strager 13 August 2010 в 03:25
поделиться

5 ответов

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, ...);

* Я не перехожу к множеству случаев; это переписано для простоты понимания проблемы.

5
ответ дан 30 November 2019 в 22:43
поделиться

Я думаю, что вас смущает именно то, откуда на самом деле "это" исходит. Так что терпите меня - вот очень краткое объяснение, которое, я надеюсь, прояснит.

В 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 (в зависимости от того, как вы это видите).

Это ответ на ваш вопрос? Могу уточнить при необходимости.

6
ответ дан 30 November 2019 в 22:43
поделиться

см. Эту ссылку http://www.quirksmode.org/js/this.html Он расскажет вам об этом ключевом слове, но я не уверен, что это (), может быть его какая-то функция, определяемая пользователем ... о которой вы не знаете ...

0
ответ дан 30 November 2019 в 22:43
поделиться

«это» означает контекст выполняемой в данный момент функции.

Код, который вы публикуете, обязательно появляется в функции, которая действует как метод для объекта. Итак, объект - это контекст функции.

«new this ()» вернет клон текущего объекта после выполнения его функции-конструктора с переданными аргументами.

0
ответ дан 30 November 2019 в 22:43
поделиться

this () относится к функции, в которой находится код, но this () должен находиться внутри этой функции. Вызов нового this (); внутри функции создаст бесконечный цикл. Вызов его вне функции был бы излишним, потому что нет функции / класса, установленного как this ().

-1
ответ дан 30 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: