【发布时间】:2018-03-29 20:28:01
【问题描述】:
我很清楚 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 构造函数中,在调用 new Employee(...) 时导致对象具有 name 和 age 属性
我知道它正在调用 Person 函数,其中 this 是 Employee 中的上下文,但目前尚不清楚属性如何进入结果对象。 “幕后”到底发生了什么?
【问题讨论】:
-
我建议投入大量时间研究 JavaScript 闭包。 stackoverflow.com/questions/111102/…
-
@Kris 与闭包无关,这只是 javascript 的本质,它在“动态”
this指针上运行,这让那些不理解它的人发疯。这就是为什么您可以在 javascript 中“借用”函数的原因,常见的模式是Array.prototype.slice.call(nodeList)在添加Array.from之前将NodeList转换为数组 -
这是因为当
newinstanceofEmployee被称为Person被称为 width 它的this绑定到 instanceofEmployee。 -
@PHPglue 我明白它为什么会发生,但不清楚这些属性是如何添加到实例中的。如果您要将代码复制并粘贴到 JS 控制台中,仅运行
Person.call(this, 'window', 1)不会导致name或age属性添加到窗口中。只有在构造函数的上下文中调用时,结果对象才具有来自另一个构造函数/对象的属性 -
它确实有效。
Person.call(this, 'window', 1); console.log(name);你得到window。this在全球范围内就是这样。
标签: javascript oop object inheritance constructor