gpt4 book ai didi

javascript - 原型(prototype)继承中的 call() 需要什么

转载 作者:数据小太阳 更新时间:2023-10-29 05:29:29 26 4
gpt4 key购买 nike

我在破译 JavaScript 中的原型(prototype)继承时遇到了一些麻烦,并想在这里发布它。考虑这个简单的例子:

function Employee() {
this.name = "Rob";
this.dept = "R&D";
}

function Manager() {
//Employee.call(this);
this.reports = ["Report 1", "Report 2", "Report 3"];
}

Manager.prototype = Object.create(Employee.prototype);

Employee.prototype.type = "human";
m = new Manager();
console.log(m.name); //undefined
console.log(m.type); //human

我无法理解的是 Employee.call(this) 这行的实用性。由于我们要将 Employee.protoype 设置为 Manager 的原型(prototype),有什么必要(如我所见)通过 call() 显式强制在 Employee 中创建变量?之前我想可能是因为Employee的对象不存在,JS继承没有对象就不行,所以这里的call()起到了“完成对象构建”的作用”。但是,type 属性在 Manager 中得到反射(reflect)而不需要 call(),这证明我们不需要硬对象来执行继承(我的意思是是,只需类类构造函数定义即可)。

我希望我没有把它搞得太复杂。简而言之:为什么这里需要 call(),为什么属性 type 在没有 call() 的情况下也能工作(如果 call( ) 就是这么重要,就是这样)。

最佳答案

Employee.call(this) 的目的是向 Manager 实例添加名称和部门属性。

call() 的使用更符合惯例,它允许就地修改调用者 (this)。

属性 type 在您完成原型(prototype)界面后就起作用了。

如果您取消注释 Employee.call(this),则 m.name 将变为“Rob”。

关于javascript - 原型(prototype)继承中的 call() 需要什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31205772/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com