javascript继承

xan*_*ndy 8 javascript inheritance

我知道有很多类似的问题都有很多很好的答案.我试着看一下经典的继承方法,或者那些闭包方法等.不知怎的,我认为它们或多或少是"黑客"方法,因为它并不是javascript的设计目的.(如果我错了,欢迎任何人纠正我).好吧,只要它有效,我满足于经典的继承模式,如:

PARENTClass = function (basevar) { do something here; };
PARENTClass.prototype = { a: b, c: d}; // prototype is auto gen 

// Inheritance goes here
CHILDClass = function (childvar) { do something; };
CHILDClass.prototype = new PARENTClass(*1); // Actual inheritance to the prototype statement
// Instance
CHILDInstance = new CHILDClass(whatever);
Run Code Online (Sandbox Code Playgroud)

上面是某种方式,我理解JS的继承.但是我不知道如何实现的一个场景是,如果我想做一些初始化DURING对象创建(即在构造函数中),并且可以立即使用新对象....我对问题的说明可能不会太清楚了,所以让我用下面的C#Psuedo来解释我想做的事情:

class PARENT {
    public PARENT (basevar) { ... }
}
class CHILD : PARENT {
    public CHILD (basevar) : PARENT (basevar) // constructor of child, and call parent constructor during construct.
    { ... }
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因(比如init.UI元素),将它们放在构造函数中似乎是最好的方法.任何人都知道我该怎么做.

PS:在*1中,我不知道应该放在那里.PS2:以上情况我DID发现jquery.inherit库可以做,我只是想知道如果不使用库就可以实现它.PS3:或者我的理解是错误的.由于javascript并不是为了模仿OOP(这就是我称之为hack的原因),实现这一点的"正确"逻辑是什么.

Ale*_*ski 17

这不是一个黑客 ; JavaScript是一种原型语言,由维基百科定义为:

..classes不存在,行为重用(在基于类的语言中称为继承)是通过克隆作为原型的现有对象的过程来执行的.

正如它所说,JavaScript中没有使用类; 您创建的每个对象都来自JavaScript Object; JavaScript中的所有对象都有prototype对象,您创建的对象的所有实例都从其对象的原型对象"继承"方法和属性.有关更多信息,请查看MDC 原型对象参考.

在此之前,当你拨打电话时:

CHILDClass.prototype = new PARENTClass();
Run Code Online (Sandbox Code Playgroud)

这允许CHILDClass对象从PARENTClass对象向其原型对象添加方法和属性,这会产生类似于基于类的语言中存在的继承思想的效果.由于该prototype对象会影响该对象创建的每个实例,因此这允许父对象的方法和属性出现在子对象的每个实例中.

如果要在子类的构造函数中调用父类的构造函数,则使用JavaScript call函数; 这允许您在子类的构造函数的上下文中调用父类的构造函数,因此将子类中的新原型属性设置为父类中设置的属性.

您也不需要在指定的位置放置任何内容*1,因为该行仅用于将方法和属性添加到子类的原型对象中; 但是,请记住它调用父类的构造函数,因此如果在父类构造函数的操作中有任何基本参数,则应检查这些参数是否存在以避免JavaScript错误.


Aym*_*ieh 10

您可以在子类构造函数中手动调用父构造函数,如下所示:

CHILDClass = function (basevar) {
  PARENTClass.call(this, basevar);
  // do something;
};
Run Code Online (Sandbox Code Playgroud)

这里的技巧是使用该call方法,该方法允许您在不同对象的上下文中调用方法.有关更多详细信息,请参阅文档call.