JavaScript中的原型继承:I don';通常不需要调用分配给Child.prototype的父对象的构造函数

JavaScript中的原型继承:I don';通常不需要调用分配给Child.prototype的父对象的构造函数,javascript,coding-style,constructor,prototype,prototypal-inheritance,Javascript,Coding Style,Constructor,Prototype,Prototypal Inheritance,我对JavaScript并不陌生,但我永远无法理解它的原型继承 假设我们有父类和子类(创建对象的父函数和子函数)。为了能够创造孩子,我们首先需要 Child.prototype = new Parent(); 困难在于:通过将原型分配给子对象,我们又得到了一个对象父对象,它在代码中不做任何事情,只与子对象共享其属性但是父级的构造函数仍然被调用例如,如果父对象表示某个UI对象,那么在我们的应用程序中,将有一个我们实际上不希望创建的对象当然,这可能也将影响应用程序的状态 我看到了一种解决方法:将某

我对JavaScript并不陌生,但我永远无法理解它的原型继承

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

Child.prototype = new Parent();
困难在于:通过将原型分配给子对象,我们又得到了一个对象父对象,它在代码中不做任何事情,只与子对象共享其属性但是父级的构造函数仍然被调用例如,如果父对象表示某个UI对象,那么在我们的应用程序中,将有一个我们实际上不希望创建的对象当然,这可能也将影响应用程序的状态

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

RedButton.prototype = new Button(FOR_PROTO_ONLY);
然后在父构造函数中决定是否执行任何可显示的内容。但这是一个如此丑陋的解决办法


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

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

下面是一个例子:

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();