我可以在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()?
答案 0 :(得分:2)
在您的示例中,“类”将是特定于实例的。你确定要的吗?你可能正在寻找更多的东西:
function A() {
// ...
}
A.B = function() {
// ...
};
var one = new A();
var two = new A.B();
虽然“嵌套”类无法访问“私有成员”,因为JavaScript首先没有这些。
至于你的例子:
new A()
,然后访问B
,说new new A().B()
1 ,或者用new A()
替换B
变量B
实例的属性。Function.call
的实例(除非使用Function.apply
或{{1}})。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
最后请注意,虽然这样的嵌套构造函数并不常见,但是没有什么可以阻止你添加到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
答案 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()?
如上所述:)