Javascript继承-使用.call方法

Javascript Inheritance - Using the .call method

本文关键字:call 方法 使用 继承 Javascript      更新时间:2024-05-18

所以我目前正在使用多个类进行JavaScript继承,所以继承有多个级别。

我四处寻找了很多方法,发现最简单、最好的方法是使用.call()

function DerivedClass ( para1, para2)
{
    BaseClass.call(this, para1, para2);
    //Insert more code here
}
DerivedClass.prototype = Object.create(BaseClass.prototype);
DerivedClass.prototype.constructor = DerivedClass;

现在,这对我来说很好,我很高兴。但我是那种需要知道为什么或如何工作的程序员,然后才能继续。

然而,如果我只使用.call(),而不在末尾添加.protype和.constructor,那么上面的代码可以很好地工作,并且完全相同(至少对于我正在使用它的情况)。

有人能向我解释一下,如果没有这两条底线,继承仍然可以正常工作,那么为什么使用这种方法需要这两条红线吗?

谢谢。

DerivedClass.prototype = Object.create(BaseClass.prototype);

这是实现整个继承所必需的。DerivedClass继承了BaseClass,因为DerivedClass原型是BaseClass.prototype加上新的、孤立的DerivedClass成员。

这样,DerivedClass实例也将能够访问BaseClass成员,依此类推(如果使用第三个对象继续原型链)。

另一方面,如果您错过了链接原型的部分,那么您就没有实现继承。代码。。。

BaseClass.call(this, para1, para2);

它与基于类的面向对象语言CCD_ 8是等价的。ECMA脚本6/2015及以上已经有了它:

class Derived extends Base
{
      constructor(a, b) 
      {
          // This is the same as Base.call(a, b);
          super(a, b);
      }
}

总之,您可以在BaseClass构造函数中添加添加的属性,但就JavaScript的工作方式而言,这不是继承。请参阅其他问答;A获取更多详细信息:Javascript:了解原型链

对于其他代码(构造函数设置的东西),你应该检查这个其他的Q&A: 为什么需要设置原型构造函数?

我认为您已经研究了很多在JavaScript中进行继承的方法,但没有找到所有这些方法背后的核心概念。

在JavaScript中实现继承的一种方法是通过原型链接。通过这个过程,子类通过__proto__(下划线-下划线-原型-下划线-下划线)链接指向父类。

简而言之,在JavaScript 中进行继承时需要查找两个属性

  1. 函数的原型->属性
  2. __对象的proto__->属性

proto链接由JavaScript用来查找父级中存在的属性(如果在子级中找不到)。

举个例子:

var base{
    prop1 : 4,
    prop2 : 100
}

假设base是其他子类想要继承的对象

要继承这个对象,子类需要将其原型链接指向这个对象

function Child1(){
  //child1 function body
} 
Child1.prototype = base;

通过这样做,从Child1函数创建的许多对象也将具有基本对象的属性,但这些对象的构造函数将显示为object,而不是Child1。

要修复此问题,构造函数属性也需要更新

Child1.prototype.constructor = Child1

.call函数所做的只是调用父函数,将当前子类的"this"或上下文传递给另一个尚未继承的函数。

如果省略最后两行,则DerivedClass创建的对象将不包含BaseClass 的属性