在JavaScript中嵌套类和此值

时间:2012-01-02 20:41:51

标签: javascript class nested this prototype

我可以在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 个答案:

答案 0 :(得分:2)

在您的示例中,“类”将是特定于实例的。你确定要的吗?你可能正在寻找更多的东西:

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()替换B变量
  2. 两者都不是,现在这是一个空话......但它将是B实例的属性。
  3. Function.call的实例(除非使用Function.apply或{{1}})。

  4. 1 是的,它有效!

答案 1 :(得分:1)

这是非常不正统的,但是没有什么能阻止你在JavaScript中嵌套构造函数。

从您的示例中,您可以从A:

的实例访问B函数
var someA = new A();
var someB = new someA.B();

回答你的另一个问题:

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

B内部this引用的内容取决于B 调用的方式。如果您使用B关键字将new作为构造函数调用,则this将成为继承自B原型的新对象。

如果您在没有new的情况下致电B,则会将其视为方法,this将成为调用此方法的A实例。

依此类推C.如果使用new调用C,则C内部的this将成为继承自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

Updated Demo

答案 2 :(得分:1)

摘要:

在不使用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.Iside B()'this'指向哪里。到A()或B()?

如上所述:)