我很清楚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
age
和new Employee(...)
属性
我理解它正在调用Person函数,this
是Employee
中的上下文,但不清楚属性是如何进入结果对象的。究竟发生了什么“引擎盖下?”
答案 0 :(得分:2)
我了解它正在调用
中的上下文Person
函数,其中this
是Employee
您是否也了解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中的window
)。 new
实例创建new
(独立于其原型继承除外)对象,并且this
上下文绑定到它。如果未指定返回值,new
个实例也会返回this
。这也应解释为什么EventListener中的this
上下文附加到它所属的Object ...元素。
要以菊花链形式连接实例方法,这是return this;
中常见的做法。