Javascript继承 - 构造函数中声明的对象是在实例之间共享的吗?

Sam*_*Lee 8 javascript inheritance

我在没有Prototype/jQuery的JavaScript中进行面向对象编程(我将jQuery用于其他东西).到目前为止,它一直运行良好,但我遇到了继承问题.基本上,当我在构造函数中声明对象时,它们在实例之间共享.以下是一些示例代码:

    A = function()
    {
        this.y = new Array();
    }

    A.prototype.doStuff = function(n)
    {
        this.y.push(n);
    }

    B = function()
    {
    }

    B.prototype = new A();

    var b1 = new B();
    var b2 = new B();

    b1.doStuff(100);
    b2.doStuff(200);

    console.log("b1:");
    console.log(b1);
    console.log("b2:");
    console.log(b2);
Run Code Online (Sandbox Code Playgroud)

此输出的阵列[100, 200]两者b1b2.我想要的是b1b2拥有自己的,独立的阵列来y.我该怎么做?

(PS.我认为Prototype的类系统内置了一些内容.但我宁愿不重写一堆我的代码来使用该类系统)

T.J*_*der 7

问题是你的A构造函数只对所有B实例运行一次,因此this.y只引用一个数组.任何对它的引用B都将通过原型链解析为单个中心A引用,只有一个引用y.这是一个非常有用的功能,只是不是你想在这里做的.

答案是将构造与初始化分开; 构造函数设置中心资源,初始化程序初始化实例.这就是我在JavaScript中看到的大多数"类"实现所处理的问题.为了实现这一点,您必须为层次结构中的每个级别提供一种方法来调用前一级别的初始化程序(这对其他方法也很有用) - 例如,超级调用.

超级调用就是为什么你可能最好使用像Prototype这样的东西:它们很难做得很好,并且容易陷入"孙子"问题 - 这个解决方案似乎有用,但最终只能工作使用Parent <-Child结构,而不是Parent <-Child <-GrandChild结构.

但是,如果你要做你自己的继承机制,那么来自我可怜的博客的超级调用的帖子可能会有所帮助,因为我会深入研究其中的一些问题.它需要Prototype的继承机制的简化版本,解构它,并讨论一种做超级调用的方法,它没有我与Prototype当前超级调用有一些问题.这可能会帮助您在自己的机制中执行它们.