JavaScript:带有参数和继承的构造函数

时间:2015-09-25 05:46:31

标签: javascript inheritance prototype prototypal-inheritance

我已经注册,希望有人可以终于提供实际运行的Javascript原型继承的说明。我感兴趣的特定代码集中在我自己编写的库上,用于处理链接列表,二叉树等的生成等任务,并为此定义了以下构造函数:

function ListLinks(objLink)
{
this.prev = null;
this.next = null;
this.content = objLink;
}

这个想法是' prev'和' next'属性是指向其他ListLinks对象的链接,以及'内容' property是包含插入到列表或树中的数据的对象的链接。

现在,使用对与上述ListLinks对象关联的原型对象的引用,我成功添加了一些类方法,以执行诸如条目插入,条目删除,列表遍历和树遍历等任务。这些都很好用。

现在,因为我想在新的对象类型中利用这个功能,我认为智能方法是从新对象的ListLinks对象继承该功能,包括所有属性和方法。新对象我称之为RenderTree对象,因为我对生成图形渲染数据的二叉树很感兴趣。我的想法是,我可以将输入的渲染数据按照距观察摄像机的距离对树进行排序,并使用树的有序遍历来实现Painter算法。但这不是我的问题。

我的问题是说服JavaScript原型继承机制允许我的RenderTree对象继承ListLinks对象的属性和方法,而不会给我带来各种烦人的错误。

问题是,因为ListLinks构造函数接受参数,所以我无法创建ListLinks对象的实例,并将其用作代码中的原型,如:

RenderTree.prototype = new ListLinks(object);

因为这样做会强制RenderTree对象的所有实例都拥有'内容'属性设置为相同的值,甚至尝试显式修改创建的实例中的值失败。然而,如果不做上述某种操作,我就无法改变实例化对象的身份 - 它们保留了ListLinks对象(父对象)的身份,而不是获取子对象的身份(RenderTree对象) ,这是使用上述内容的全部要点,以及随后的内容:

RenderTree.prototype.constructor = RenderTree;

这样做是为了让RenderTree对象可以继承所有ListLinks对象'属性和方法,还添加了额外的功能,以便于生成渲染数据,我打算将其插入到RenderTree对象的二叉树中,所述对象具有自己独特的身份。

现在,从我的角度来看,其中一个奇怪的方面是,虽然内容'实际上,RenderTree对象的属性实际上是不可变的,' next'的 isn' t 为真。和' prev'属性。这告诉我,遗传机制的核心潜伏着一些可怕的不一致,这只会让我想回到基于阶级的语言,而不会表现出这种烦人的行为。用C ++这样的语言执行上述任务,定义一个ListLinks类,然后定义一个RenderTree类作为其扩展,不会在我的腿上放下这个不必要的麻烦。

现在,为了解决这个问题,我已经看到了关于这个问题的不少于四个不同的论述(其中两个来自这里,因为它发生),包括使用Object.create( ),使用超级构造函数调用(这在Ben Nadel的页面上有更详细的介绍),并使用伪构造函数。我所尝试过的一切都没有奏效。所有这一切都发生在我尝试使用其中一种新方法时,以前大多数在旧代码中工作的方法最终会被破坏。事实上,我最初从一个名叫Toby Ho的人的网页上了解了整个业务(我会发布一个链接,但我刚刚被告知我的帖子中没有两个网页链接,所有帮助增加了试图解决这个问题的挫败感,谢谢),但该页面对我的特定问题没有任何帮助,除了解决允许我在我的代码中使用类方法功能的问题。

现在,鉴于巨大的挫折感,我已经有了这个,是不是要问,看到有人向我提供了这种继承机制的解释[1]与我上面提到的观察结果一致,[2]产生了一些有用的东西,并且[3]证明那里的人确实实际上理解它在做什么?只有我越来越多地得出这样的结论:设计最新版本的JavaScript的人只是组成了当时看起来很好的东西,然后把它扔进了解释器而没有说明程序员是否试图使用它任何意义上的。

如果我无法通过一些方法实现应该是微不足道的,而 在基于课程的语言中是微不足道的我熟悉我认为,就严肃的工作而言,我会把JavaScript放到垃圾箱里。

0 个答案:

没有答案