Неверный оператор JavaScript: "var x = new this();"

Я думал, что понял концепцию объекта прототипа JavaScript, а также [[proto]], пока не увидел несколько сообщений о наследовании классов.

Во-первых, "JavaScript OOP - умный способ" на http://amix.dk/blog/viewEntry/19038

Смотрите раздел реализации:

var parent = new this('no_init');

А также "Простое наследование JavaScript" на John Resig отличный блог.

var prototype = new this();

Что означает new this();?

Это утверждение не имеет для меня никакого смысла, потому что я понимаю, что this указывает на объект, а не на конструктор. Я также пробовал тестировать утверждения в Firebug, чтобы понять это, и все, что я получаю, это синтаксические ошибки.

Моя голова полностью исчезла.

Не могли бы вы объяснить это подробно?

Ответы

Ответ 1

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, потому что:

Person.extend(...);
// is the same as
Person.extend.call(Person, ...);
// is the same as
AJS.Class.prototype.extend.call(Person, ...);

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

Ответ 2

Что вас сбивает с толку, я думаю, именно там, где действительно существует "this". Так что медведь со мной - вот очень краткое объяснение, которое, я надеюсь, станет понятным.

В JavaScript, что "this" относится к функции, всегда определяется во время вызова функции. Когда вы выполните:

jimmy.nap();

Функция nap (method) запускается и принимает jimmy как "this".

Какие объекты имеют ссылки на сон, не имеет значения. Например:

var jimmy = {}, billy = {};
jimmy.nap = function(){ alert("zzz"); };
var jimmy_nap = jimmy.nap;
jimmy_nap(); // during this function 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 excution, this is billy, *NOT* jimmy
jimmy.nap(); //okay, this time,  this is jimmy!

Другими словами, всякий раз, когда у вас есть:

var some_func = function(arg1, arg2){ /*....*/ };
// let 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 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({ /* ... */ });

Поп-опрос: когда продлевает пробеги, что думает "this"? Ответ: Правильно. "Человек".

Таким образом, озадачивающий код на самом деле такой же, как (в этом конкретном случае):

var prototype = new Person('no_init');

Не так загадочно, а? Это возможно, потому что, в отличие от некоторых языков, переменная JavaScript, включая "this", может содержать любое значение, включая функцию, такую ​​как Person.

(Нет ничего, что делает Person конкретным конструктором. Любая функция может быть вызвана с помощью нового ключевого слова. Если я назову точную семантику, я думаю, что это то, что когда функция вызывается с новым ключевым словом, она автоматически задается пустой объект ({}) в качестве его контекста ("this"), а когда функция возвращается, возвращаемое значение - это тот же самый объект, если только (возможно?) функция возвращает что-то еще)

Это крутой вопрос, потому что он говорит о довольно важной части четкости или странности JavaScript (в зависимости от того, как вы его видите).

Отвечает ли это на ваш вопрос? При необходимости я могу уточнить.

Ответ 3

Представьте себе следующую ситуацию:

var inner = function () {
    var obj = new this;
    console.log(obj.myProperty);
};

var f1 = function () {
    this.myProperty = "my Property"
}

f1.f2 = inner;
f1.f2();

Здесь вызывающий объект сам является функцией, поэтому этот возвращает функцию, и мы можем создать экземпляр.

Чтобы использовать this() (не this), внешняя функция (контекст) должна сама возвращать smth, которая может быть создана (другая функция):

var inner = function () {
    var obj = new this();
    console.log(obj.myProperty);
};

var f1 = function () {
    var func = function () {};
    func.myProperty = 'my property';
    return func;
};

f1.f2 = inner;
f1.f2();

Ответ 4

В javascript static вы можете вызвать new this() так,

var Class = function(){}; // constructor
Class.foo = function(){return this;} // will return the Class function which is also an object

Следовательно,

Class.foo = function(){ return new this();} // Will invoke the global Class func as a constructor

Мораль истории состоит в том, чтобы не забывать, что функции такие же, как любые другие объекты, когда вы их не называете.

Ответ 5

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

Ответ 6

"this" означает контекст текущей функции.

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

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

Ответ 7

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