Класс и область применения в Javascript - PullRequest
5 голосов
/ 17 июля 2011

Я написал следующий код в Javascript.

function main()
{
    this.a ;
    this.set = function()
    {
        a = 1;
    }
}

var l = new main();

alert("Initial value of a is "+ l.a );
l.set();
alert("after calling set() value of a is   "+ l.a );

В обоих случаях я получил значение a как неопределенное. Почему a не определено даже после того, как я вызвал set ()?

Ответы [ 5 ]

7 голосов
/ 17 июля 2011

Вам необходимо сослаться на a с помощью this.a.

В противном случае вы ссылаетесь на локальную переменную a (если бы вы использовали var, пропуск ее составил aсвойство объекта window, по сути глобальное), а не свойство объекта a (this будет связано с вновь созданным объектом).

jsFiddle .

2 голосов
/ 17 июля 2011

чтобы javascript это:

function main()
{
    this.a ;
    this.set = function()
    {
        a = 1;
    }
}

будет выглядеть как

function main();

{ // starts unattached object literal
    this.a ;
    this.set = function();

    { // starts another unattached object literal 
        a = 1; // sets value to   window.a
    }
}
2 голосов
/ 17 июля 2011

В вашей функции "set" отсутствует ссылка на this:

   this.a = 1;
1 голос
/ 17 июля 2011

В дополнение к предыдущим ответам: в Javascript нет классов, только объекты.Вы можете создавать классоподобные вещи, но модель наследования javascript - prototypal .В вашем коде main - это функция конструктора , из которой вы можете получать экземпляры.

Многие люди все еще пытаются заставить javascript использовать все виды классических шаблонов ООП.Это все вполне возможно, но это наносит вред языку.Потратьте некоторое время на просмотр этой серии лекций

0 голосов
/ 17 июля 2011

Вы не можете объявить свойство объекта неопределенным, как вы это сделали. И вы неправильно указали свойство a в методе case. Вот исправление:

function main() {
    this.a = null;
    this.set = function() {
        this.a = 1;
    }
}

var l = new main();

alert("Initial value of a is " + l.a);
l.set();
alert("after calling set() value of a is   " + l.a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...