2017-10-18 105 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;