2017-10-18 106 views
2

我很清楚JavaScript不是基于类的语言。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) 员工构造函数,导致对象在致电时具有nameage属性new Employee(...)

据我所知,它调用Person函数,thisEmployee中的上下文,但不清楚属性如何进入结果对象。到底发生了什么?“引擎盖下?”

+0

我建议投入大量时间学习JavaScript关闭。 https://开头计算器。com/questions/111102/how-do-javascript-closures-work – Kris

+2

@Kris与闭包无关,它只是javascript的本质,它在“dynamic”这个指针上运行,它驱动那些不理解它的人疯。这就是为什么你可以在javascript中“借用”函数,常用的模式是'Array.prototype.slice.call(nodeList)'在添加'Array.from'之前将'NodeList'转换为数组。' – Dummy

+0

这是因为当'new'instanceof'Employee'被调用'Person'被称为宽度时,'this'被绑定到Employee的instanceof。 – PHPglue

回答

2

据我所知,它调用了Person功能与this是内Employee

的情况下你也明白什么是“内Employee语境”是什么?这是运行构造函数正文(Employee,在new Employee)之前创建的new运算符创建的新对象。详情请参阅What is the 'new' keyword in JavaScript?

目前还不清楚属性如何进入结果对象。究竟发生了什么“底下?”

性质获得由任务创建的:

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

再次,this是指生成的对象。在前两种情况下,因为the call method明确用于Person,在后一种情况下,因为new用于Emloyee

2

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

要将您的实例方法进行菊花链连接,通常会在其中使用return this;