Javascript,内部类以及如何有效地访问父作用域

Che*_*eso 7 javascript oop closures

在Javascript中,我想定义一个带有内部(或嵌套)类的类.在内部类中,我希望能够访问父实例.我怎样才能有效地做到这一点?

有些代码会显示我的意思.假设我定义了一个类MyType1,它暴露了几个属性和一个函数,SayHello:

(function(){
    MyType1 = function(name){
        this.TypeName = "MyType1";
        this.Name = name;
    };

    MyType1.prototype.SayHello = function() {
        say(this.Name + " says hello...");
    };
})();
Run Code Online (Sandbox Code Playgroud)

好的,现在,从那里开始,我想在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...");
    };
})();
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样使用这些类:

var x = new MyType1("Victor");
x.SayHello();

var c = new x.Child("Elizabeth");
c.Introduce();
Run Code Online (Sandbox Code Playgroud)

一切正常.但它为MyType1的每个实例定义了一个新的Child函数(或类型,如果您愿意).我想做的是访问父类范围,而不是诉诸于低效率.像这样的东西:

(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;

})();
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.该parentName变种是超出范围,当然.

Child实例(在构造函数或任何类函数中)是否有一种有效的方式来访问父(MyType2)实例?


我知道我可以将Child类定义为一个独立的非嵌套类,然后在ctor中,只需传递Parent实例.但这会创建对父实例的N个引用,每个子实例都有一个引用.这似乎是我想避免的低效率.

谢谢你的任何提示.


编辑 - 我希望Child访问父实例的原因是父拥有一个创建起来相当昂贵的对象 - 类似于数据库连接 - 我希望孩子能够利用那个东西.

use*_*461 3

如果您在处理 javascript 时消除“类型”、“类”等概念,它可能会对您有所帮助。在 javascript 中,“类型”、“类”、“函数”、“实例”或“对象”没有区别——一直都是“对象”。

由于每个“类型”都是一个“对象”并且是可变的,因此您无法获得通过重用单个类型定义从 Java 或 C++ 中获得的强类型效率收益。将 javascript 中的“new”运算符想象为“克隆定义并调用构造函数”之类的东西,之后实例的定义仍然可以更改。

因此,请使用您的第一个工作示例:通过做不同的事情您不会获得任何收益。