【发布时间】:2011-06-13 16:56:36
【问题描述】:
在 Javascript 中,我想定义一个具有内部(或嵌套)类的类。在内部类中,我希望能够访问父实例。我怎样才能有效地做到这一点?
一些代码会显示我的意思。假设我定义了一个类 MyType1,它公开了几个属性和一个函数SayHello:
(function(){
MyType1 = function(name){
this.TypeName = "MyType1";
this.Name = name;
};
MyType1.prototype.SayHello = function() {
say(this.Name + " says hello...");
};
})();
好的,现在,从那里开始,我想在 MyType1 中添加一个“内部类”,所以我添加了一些新代码,使其看起来像这样:
(function(){
MyType1 = function(name){
this.TypeName = "MyType1";
this.Name = name;
var parentName = name;
this.Child = function(name) {
this.Description = parentName + "'s child, " + name;
};
this.Child.prototype.Introduce = function() {
say(this.Description + ", greets you...");
};
};
MyType1.prototype.SayHello = function() {
say(this.Name + " says hello...");
};
})();
现在我可以像这样使用这些类:
var x = new MyType1("Victor");
x.SayHello();
var c = new x.Child("Elizabeth");
c.Introduce();
一切正常。但它为 MyType1 的每个实例定义了一个新的 Child 函数(或 type,如果你愿意的话)。我想做的是访问父类范围,而不是利用这种低效率。 像这样的:
(function(){
MyType2 = function(name){
this.TypeName = "MyType2";
this.Name = name;
this.Prop1 = 1872;
var parentName = name;
};
MyType2.prototype.SayHello = function() {
say(this.Name + " says hello...");
};
var c1 = function(name) {
this.Description = parentName + "'s child, " + name;
// ^^ no go! ^^
};
c1.prototype.Introduce = function() {
say(this.Description + ", greets you...");
};
MyType2.prototype.Child = c1;
})();
但是,这不起作用。当然,parentName 变量超出了范围。
子实例(在构造函数中,或在任何类函数中)是否有有效的方法来访问父 (MyType2) 实例?
我知道我可以将 Child 类定义为一个独立的非嵌套类,然后在 ctor 中,只需传递 Parent 实例。但这会创建 N 个对父实例的引用,每个子实例一个。这似乎是我想避免的低效率。
感谢任何提示。
EDIT - 我希望 Child 能够访问父实例的原因是,父实例拥有一个创建起来相当昂贵的对象 - 类似于 db 连接 - 我会喜欢孩子能够利用那个东西。
【问题讨论】:
-
呃,还有更多滥用 Javascript 来引入“OOP”的废话。这种语言没有类:如果你想要它们,请使用有类的东西!
-
您可能会发现这很有用:blog.niftysnippets.org/2009/09/… 这是一组帮助函数(及其解释),提供了一种简单但有效的方法来创建通过原型继承创建的“类”的“子类” .看起来你是手动完成的,所以它可能会为你省点麻烦。
-
@Tomalek:你说的很对,当然,JavaScript 没有类。它是面向对象的,但确实具有继承性。
-
@Crowder :我没有进行原型继承。这是一个嵌套/内部类。此示例中没有继承。 @Vidas - anon fn 仅用于在我的代码模块中确定范围帮助。它没有为示例添加任何内容。 @Tomalak - 听起来你对我用 my 代码做什么有疑问。嗯。有没有想过为此去看治疗师?
-
@LightnessRacesinOrbit 这样的可憎? developer.mozilla.org/en-US/docs/Web/JavaScript/…
标签: javascript oop closures