Javascript继承-使用.call方法
Javascript Inheritance - Using the .call method
所以我目前正在使用多个类进行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 中进行继承时需要查找两个属性
- 函数的原型->属性
- __对象的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 的属性
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- JavaScript中的这个call()-方法是如何工作的
- Javascript继承-使用.call方法
- 在这种情况下,有什么方法可以向`.call()`发送更多的参数吗
- 使用 .call/.apply 隐藏类方法
- 直接调用方法和使用“.call”方法之间的区别?WSS
- Javascript call() 方法未生成预期的输出
- 处理 Array.prototype.slice.call(参数)的更简洁方法
- 使用JS.call()方法的原因
- Meteor方法成功更新了数据库,但向Meteor.call返回500个错误
- 流星.Call一键点击调用方法100次
- 当使用apply()和call()方法很容易继承时,为什么人们在javascript中使用prototype ?
- 为什么在方法上调用(call)和在对象上调用方法是有区别的
- 在扩展THREE.js的“类”时,为什么需要从新对象中调用.call(this)方法?
- 在webkit中对原生JavaScript方法使用apply/call
- 调用方法和Array.prototype.slice.call的用法
- 这个JavaScript Function.call方法在做什么
- .call方法参数'['和']'习俗
- Javascript:call(),apply()而不是bind()方法
- 通过 Metro.call() 传递时从对象中剥离的方法