5

我对 JavaScript 并不陌生,但我永远无法理解关于它的原型继承的某些事情。

假设我们有父子“类”(创建对象的父子函数)。为了能够创建孩子,我们首先需要

Child.prototype = new Parent();

困难在于:通过将原型分配给 Child,我们又得到了一个对象 Parent,它在我们的代码中不做任何事情,只是与 Children 共享它的属性。但是仍然调用了 Parent 的构造函数!例如,如果 parent 表示某个 UI 对象,那么在我们的应用程序中,我们将拥有另外一个我们实际上并不想创建的对象!当然,这可能并且将会影响我们应用程序的状态。

我看到了一种解决方法:将某些参数传递给 Parent 构造函数,表明我们正在创建的对象仅用于原型,而不是一般用途,例如:

RedButton.prototype = new Button(FOR_PROTO_ONLY);

然后在 Parent 构造函数中决定是否做任何可显示的东西。但这是一个丑陋的解决方法!

在面向类的语言中,例如Java,我们根本没有这样的问题,因为继承并不假设调用任何额外的函数。我应该怎么做才能不在我的程序中使用这些丑陋的技术,并且仍然能够创建一个漂亮的原型层次结构?

4

1 回答 1

1

您可以做的一件事是在构造函数中将父实例分配给它的原型属性。这意味着您不必创建无关的父实例,因此可以缓解您提到的问题,您最终可能会定义一个额外的 GUI 组件。但是,这确实意味着在实例化子实例之前必须至少有一个父实例,因此仅此一项就将其用途限制在非常特定的情况下。

这是一个例子:http: //jsfiddle.net/xwwWZ/

var Child = function() {

    this.throwATantrum = function() {

        alert("Waaaaaaaaaah");

    }
};


var Parent = function() {

    // Set the prototype here to avoid having to create an extra instance elsewhere.
    Parent.prototype = this;

    this.sayHello = function() {

        alert("Hello!");

    }
};


// We must, however, instantiate an instance of the parent before we can
// instantiate an instance of a child.
var p = new Parent();


Child.prototype = Parent.prototype;

var c = new Child();

c.throwATantrum();
c.sayHello();
于 2012-08-25T21:23:29.007 回答