继承

标签 javascript inheritance

我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 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);

以上是我对JS继承的理解。但是我不知道如何实现的一种情况是,如果我想在对象创建期间(即在构造函数中)进行一些初始化,并且可以立即使用新对象怎么办……我对问题的说明可能不会太清楚了,所以让我使用以下 C# Psuedo 来解释我想做什么:

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

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

PS:在 *1 中,我不知道应该放在那里什么。 PS2:以上情况我DID发现jquery.inherit库可以做到,只是想知道不使用库是否可以实现。 PS3:或者我的理解有误。由于 javascript 无意模仿 OOP(这就是为什么我称它为 hack),实现它的“正确”逻辑是什么。

最佳答案

这不是hack; JavaScript 是一种原型(prototype)语言,由 Wikipedia 定义在哪里:

..classes are not present, and behavior reuse (known as inheritance in class-based languages) is performed via a process of cloning existing objects that serve as prototypes.

如前所述,JavaScript 中不使用类;您创建的每个对象都是 JavaScript Object 的后代; JavaScript 中的所有对象都有 prototype 对象,并且您创建的所有对象实例都“继承”对象的原型(prototype)对象的方法和属性。查看 MDC prototype对象引用以获取更多信息。

至此,当您调用线路时:

CHILDClass.prototype = new PARENTClass();

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

如果要在子类的构造函数中调用父类的构造函数,可以使用 JavaScript call 函数;这允许您在子类的构造函数的上下文中调用父类的构造函数,因此将子类中新原型(prototype)化的属性设置为它们在父类中的设置。

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

关于继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931660/

相关文章:

javascript - document.getElementsByName ("") 相当于 YUI3.0

c++ - "Attribute is protected within this context"具有继承和 .h 和 .cpp 文件

c# - 基于示例的关于继承的混淆

python - 如何在pytest中测试类层次结构?

javascript - 仅在多个时才匹配最后一次出现

javascript - 是否有 JavaScript 的变更跟踪框架?

indexOf 内的 JavaScript 变量

javascript - 子类的 typescript 定义作为参数

c++ - 继承类c++中的常量成员

java - 为什么不能创建子类类型的父类的对象,但可以反向创建?