繼承(Inheritance)/ 原型/ 所有的東西都是物件
繼承 (Inheritance)
One object gets access to the properties and methods of another object.
繼承表示一個物件取用另一個物件的屬性或方法。
瞭解原型
JavaScript中的所有物件,包含函數所有物件都有原型屬性,這個屬性會參考到另一個物件,我們稱為原型 proto(被參考的物件)。
以obj.prop2為例,obj 是個單獨的物件,我們可以參考它的屬性物件proto,取用其屬性和方法prop2,點運算子會尋找prop2,在obj找不到就往obj的原型proto找,然後回傳,pro3同理,以此類推。
若有另個物件obj2,它可以指向同個原型,並進行分享,所以若呼叫 obj2.prop2,它會回傳一樣的屬性,和 obj.prop2 的記憶體位置一樣。
//作為原型的person
var person = {
firstName: "Default",
lastName: "Default",
getFullName() {
var fullName = this.firstName + " " + this.lastName;
return fullName;}
}var john = {
firstName: "John",
lastName: "Doe"}var jane = {
firstName: "Jane"
}示範用!不建議這麼寫!!//讓john繼承person,在john中找不到getFullName,就往proto找,在person中找到
john.__proto__ = person
console.log(john.getFullName()) = "John Doe"//在john中已經有firstName屬性,所以不會再往原型鍊上找
console.log(john.firstName) = "John"//讓jane繼承person,Jane中找不到getFullName和lastName,往上使用person的
jane.__proto__ = person;
console.log(jane.getEullName()) = "Jane Default"
*當函數被呼叫,執行環境被創造,this變數會知道我們要用的物件是哪個(就是我們呼叫的物件),所以this不會參考到person,而是會參考到j找到呼叫它的物件john/ jane。
所有東西都是物件(或純值)
JavaScript 的所有東西都是 物件 或是 純值。
函數、陣列、一般物件,所有東西到最後會到基本物件( base object, Object{} ),這個物件沒有原型(往上找是null),也就是在原型鏈最下面的東西。
The
Object.prototype
is a property of the Object constructor. And it is also the end of a prototype chain.
設定 a, b, c,並使用.__proto__一路往上找,到底都會抵達基本物件 Object{},
再往上找就是null,也就是沒有了、結束了。a = {};
b = function(){};
c = [];