gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:12:08 25 4
gpt4 key购买 nike

我在没有 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);

这为 b1b2 输出一个数组 [100, 200]。我想要的是 b1b2y 拥有自己的独立数组。我该怎么做?

(PS。我假设 Prototype 的类系统为此内置了一些东西。但是我宁愿不重写我的一堆代码来使用那个类系统)

最佳答案

问题是您的 A 构造函数只对所有 B 实例运行一次,因此 this.y 是对只有一个阵列。 B 对它的任何引用都将通过原型(prototype)链解析为单个中央 A 引用,它只有一个 y。这是一个非常有用的功能,只是不适用于您在此处尝试执行的操作。

答案是构造和初始化分开;构造函数设置中央资源,初始化程序初始化一个实例。这就是我为 JavaScript 看到的大多数“类”实现处理问题的方式。为此,您必须为层次结构中的每个级别提供一种方法来调用上一级的初始化程序(这对其他方法也很有用)——例如, super 调用。

Supercalls 是您最好为此使用 Prototype 之类的东西的原因:它们很难做好,而且非常很容易陷入“孙子”问题——一个解决方案这似乎可行,但最终只能使用 Parent<-Child 结构,而不是 Parent<-Child<-GrandChild 结构。

但是,如果您要实现自己的继承机制,this post on supercalls当我深入研究其中一些问题时,来 self 可怜的贫血博客的内容可能会有所帮助。它采用了 Prototype 继承机制的简化版本,对其进行了一些解构,并讨论了一种执行 super 调用的方法,该方法没有我在 Prototype 当前的 super 调用中遇到的一些问题。这可能会帮助您在自己的机制中完成它们。

关于Javascript 继承——在构造函数中声明的对象在实例之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com