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

前端之家收集整理的这篇文章主要介绍了Javascript,内部类以及如何有效地访问父作用域前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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函数(或类型,如果你喜欢).我想要做的是访问父类范围,而不是诉诸于低效率.
像这样的东西:

(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 var超出了范围.

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

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

谢谢你的任何提示.

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

解决方法

如果你在处理javascript时不使用“类型”,“类”等概念,它可能会帮助你.在javascript中,没有区别于“类型”,“类”,“函数”,“实例”或“对象” – 它一直是“对象”.

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

所以请按照你的第一个工作示例:做一些与众不同的事情,你不会获得任何好处.

猜你在找的JavaScript相关文章