使用.call(this)进行JavaScript继承

Rob*_*cha 5 javascript inheritance

代码来自MDN:

function Employee() {
    this.name = "";
    this.dept = "general";
}

function Manager() {
    Employee.call(this);
    this.reports = [];
}

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

function WorkerBee() {
    Employee.call(this);
    this.projects = [];
}

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

var x = new WorkerBee();

console.log( x );
Run Code Online (Sandbox Code Playgroud)

输出: WorkerBee {name: "", dept: "general", projects: Array[0]}

有什么影响Employee.call(this);?我知道通过运行代码,继承成功是必要的..call()简单陈述的文档,

方法调用具有给定此值的函数和单独提供的参数.

好的,所以它调用构造函数,Employee()但没有使用new运算符,也没有return返回对象及其属性.如何Employee.call(this)导致子对象继承父属性?

如果省略此行,则只有projects数组作为属性存在.

dfs*_*fsq 2

所做call的只是用给定的上下文调用函数this。在您的示例中,这意味着Employee调用函数时this其内部是 的实例WorkerBee。因此,在这种情况下发生的情况是,当执行时,它会创建并为此时的对象Employee设置自己的属性。thisWorkerBee

检查运行代码时控制台记录的内容:

function Employee() {
    console.log(this instanceof WorkerBee);
    this.name = "";
    this.dept = "general";
}
Run Code Online (Sandbox Code Playgroud)

...你会看到它this确实指向 的对象实例WorkerBee

此模式用于使一个构造函数在外部宿主对象(上下文)上创建自己的属性。它也被称为“借用构造函数”。