JavaScript中的原型继承:我通常不需要调用分配给Child.prototype的Parent对象的构造函数

时间:2012-08-25 18:04:15

标签: javascript coding-style constructor prototype prototypal-inheritance

我不是JavaScript的新手,但我从来不会理解它的原型继承。

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

Child.prototype = new Parent();

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

我看到了解决这个问题的方法:将某些参数传递给Parent构造函数,指示我们创建的对象仅用于原型,而不是一般用途,如:

RedButton.prototype = new Button(FOR_PROTO_ONLY);

然后在Parent构造函数中决定是否执行任何可显示的内容。但这是一个如此丑陋的解决方法!

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

1 个答案:

答案 0 :(得分:1)

您可以做的一件事是在构造函数中将父实例分配给它的prototype属性。这意味着您不必创建父项的无关实例,因此可以缓解您提到的最终定义额外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();