Почему «this» всегда является окном в прототипе для классов Javascript - PullRequest
0 голосов
/ 27 мая 2011

Вот код

function Person(name, age, weight) {
    this._name = name;
    this._weight = weight;
    this._age = age;
}

Person.prototype = {
    Anatomy: {
        Weight: this._weight,
        Height: (function () {
            //calculate height from age and weight
        })
    }
}

Я ожидал, что Anatomy.weight будет 60, когда я запустил этот код:

var x = new Person('jack',24,60);
console.dir(x.Anatomy);

К моему удивлению, это было не определено. При проверке показалось, что this имеет в виду окно глобального объекта. Теперь, что здесь произошло :( Я ожидал, что this._weight будет ссылаться на вес объектов Person, в противном случае, по грубым расчетам, это должно как минимум указывать на Анатомию, поскольку это объект. Может ли кто-то прояснить сомнение

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

Вы не можете к этому. this доступно только в функциях. Где вы использовали это, это относится к глобальному объекту. Возможное решение будет следующим:

function Anatomy(weight) {
    this.Weight = weight;
    this.Height = [...];
}

function Person(name, age, weight) {
    this._name = name;
    this._weight = weight;
    this._age = age;
    this.Anatomy = new Anatomy(this._weight);
}

Я не знаю, является ли это лучшим решением, но это лучшее, что я могу придумать прямо сейчас.

1 голос
/ 27 мая 2011

this изменяется в зависимости от области действия, а область действия зависит только от функций. Таким образом, поскольку Person.prototype - это просто объект, которого нет в функции, this относится к глобальному объекту, который в браузерах обычно равен window.

Редактировать: пример исправления

function Person(name, age, weight) {
    this._name = name;
    this._weight = weight;
    this._age = age;
    this.Anatomy: {
        Weight: this._weight,
        Height: (function () {
            //calculate height from age and weight
        })
    }
}
0 голосов
/ 27 мая 2011

Это не имеет ничего общего с прототипами.

Когда вы работаете в браузере, ваш контекст (this) устанавливается на window объект. Это позволяет вам звонить setTimeout и alert и др. как будто они были глобальными функциями. То есть любой твой скрипт - это метод глобального window объекта.

Это не так в других хостах Javascript, например в node.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...