Javascript如何将值从“超类”传递到“子类”

时间:2017-10-18 03:00:50

标签: javascript oop object inheritance constructor

我很清楚javascript不是基于类的语言。

这里说的是我们在JavaScript中继承的一种方式(<之一):

function Person(name, age) {
        this.name = name;
        this.age = age;
    }

    Person.prototype.introduceSelf = function() {
        console.log("My name is " + this.name + " and I'm " + this.age);
    }

    function Employee(name, age, employeeID) {
        Person.call(this, name, age);
        this.employeeID = employeeID;
    }

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

    Employee.prototype.sayEmployeeID = function() {
        console.log('My Employee ID is: ' + this.employeeID);
    }

    var joe = new Employee('Joe', 22, 42);
    joe.introduceSelf() // returns: My name is joe and I'm 22
    joe.sayEmployeeID() // returns: My Employee ID is: 42

我的问题是:如何简单地调用Person.call(this, name, age) 在Employee构造函数中,在调用name

时导致对象具有agenew Employee(...)属性

我理解它正在调用Person函数,thisEmployee中的上下文,但不清楚属性是如何进入结果对象的。究竟发生了什么“引擎盖下?”

2 个答案:

答案 0 :(得分:2)

  

我了解它正在调用Person函数,其中thisEmployee

中的上下文

您是否也了解Employee&#34;中的&#34;背景?是什么?它是new运算符在运行构造函数体(Employee中的new Employee)之前创建的新实例,即生成的对象。有关详细信息,请参阅What is the 'new' keyword in JavaScript?

  

不清楚属性是如何进入生成的对象的。究竟发生了什么&#34;引擎盖下?&#34;

属性由作业创建:

this.name = name;
this.age = age;
…
this.employeeID = employeeID;

同样,this指的是结果对象。在前两种情况下,因为Person明确使用了the call method,后一种情况是因为new使用了Emloyee

答案 1 :(得分:2)

在Object的方法中,this上下文属于Object的上下文。在Person的情况下,它是instanceof Function,其this上下文绑定到全局上下文(客户端JavaScript中的windownew实例创建new (独立于其原型继承除外)对象,并且this上下文绑定到它。如果未指定返回值,new个实例也会返回this。这也应解释为什么EventListener中的this上下文附加到它所属的Object ...元素。

要以菊花链形式连接实例方法,这是return this;中常见的做法。