Вложенность классов и это значение в JavaScript - PullRequest
2 голосов
/ 03 января 2012

Могу ли я написать вложенные классы в Javascript?

function A()
{
    this.a;
    this.B = function()
    {
      this.ab ;
      this.C  = function()
      {
         this.ab = 0;
      }
    }
}

Если приведенный выше код верен, то

1.How do I declare an object of type B
2.Whose property is  ab.A() 's  or B() 's?.
3.Inside B() where does the 'this' points to.To A() Or to B()?

Ответы [ 3 ]

2 голосов
/ 03 января 2012

В вашем примере «классы» будут зависеть от конкретного экземпляра.Вы уверены, что хотите этого?Возможно, вы ищете что-то более похожее на:

function A() {
    // ...
}

A.B = function() {
    // ...
};

var one = new A();
var two = new A.B();

Хотя «вложенные» классы не смогут получить доступ к «закрытым членам», потому что JavaScript не имеет их в первую очередь.


Как в вашем примере:

  1. Вы должны создать экземпляр A, скажем new A(), и получить доступ к B, скажем new new A().B() 1, или замена new A() на переменную.
  2. На данный момент это не пустой оператор ... но это будет свойство экземпляра B.
  3. Toэкземпляр B (если не используется Function.call или Function.apply).

1 Да, работает!

1 голос
/ 03 января 2012

Аннотация:

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

1. Как мне объявить объект типа B

Первый способ (из любопытства) - при вызове A без использования new оператор this будет ссылаться на window объект и B метод и все остальное, что было объявлено с thisутечки к глобальной области видимости, потому что A == window.A => true

A(); 
var b = new B; // means => new window.B  //parentheses can be ommited if you invoking without arguments  
alert( ab )  // alerts 'inside A'  -> value from code presented below

или из экземпляра A:

new new A().B  // means => new ( new A ).B  

Будьте осторожны.

2.Что свойство является ab.A () или B ()?.

Как указано выше, это зависит от того, как мы к нему будем обращаться:

 function A()
    {
        this.ab = "inside A";
        this.B = function()
        {
          this.ab = "inside B";
          this.c  = function()
          {  
             this.ab = "inside C";
          }
        }
    };

Проверьте это

var a = new A;
a.ab // "inside A"
a.B(); // in B now 'this' refers to 'a', 'a.ab' will be replaced to 'ab' from inside 'B'
a.ab // "inside B"

, но

var a = new A;
a.ab // "inside A"
var b = new a.B;
a.ab // "inside A"
b.ab // "inside B"

// and now
b.c() 
b.ab // "inside C" and so on:)  

3. Внутри B (), куда указывает «this».?

Как указано выше:)

1 голос
/ 03 января 2012

Это очень неортодоксально, но ничто не мешает вам вкладывать функции конструктора в JavaScript.

Из вашего примера вы можете получить доступ к функции B из экземпляра A:

var someA = new A();
var someB = new someA.B();

Чтобы ответить на другой вопрос:

 this.B = function() {
      this.ab = 0;
      this.c  = function() {
         this.ab++;
      }
    }

То, к чему относится this внутри B, зависит от того, как B вызывается . Если вы вызовете B в качестве конструктора с ключевым словом new, this будет новым объектом, унаследованным от прототипа B.

Если вы вызываете B без new, он будет рассматриваться как метод, а this будет экземпляром A, для которого был вызван метод.

И так далее с C. Если C вызывается с new, this внутри C будет новым объектом, унаследованным от прототипа C. Или C может быть методом B, который имеет гораздо больше смысла. Это то, что вы хотите:

function A() {
    this.a;
    this.B = function() {
         this.ab = 0;
         this.c  = function() {
             this.ab++;
         }
    }
}

var someA = new A();
var someB = new someA.B();

console.log(someB.ab); //0
someB.c();
console.log(someB.ab); //1

DEMO


Наконец, обратите внимание, что, хотя такие вложенные конструкторы не слишком распространены, ничто не мешает вам добавить к прототипу B, как вы это делаете с любым другим конструктором

function A() {
    this.a;
    this.B = function() {
      this.ab = 0;
      this.c  = function() {
         this.ab++;
      }
    }
    this.B.prototype.foo = function() { alert("Bar " + this.ab) };
}

var someA = new A();
var someB = new someA.B();

console.log(someB.ab);
someB.c();
console.log(someB.ab);
someB.foo();   //Bar 1

Обновленная демоверсия

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