JavaScript系列 - 深刻之從原型到原型鏈

本文詳情:https://github.com/mqyqingfen...git

構造函數建立對象
先使用構造函數建立一個對象github

function Person(){

}
var person = new Person();
person.name = "Mit";
console.log(person.name)

在這個例子中,Person 就是一個構造函數,咱們使用 new 建立了一個實例對象 person。函數

prototype
每一個函數都有一個prototype對象spa

function Person() {

}
// 雖然寫在註釋裏,可是你要注意:
// prototype是函數纔會有的屬性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

函數的prototype對象指向該構造函數建立實例的原型
圖片描述prototype

(__proto__)
每一個js對象都具備一個屬性,叫__proto__,這個屬性指向該對象的原型3d

function Person() {

}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true

更新以下
圖片描述code

constructor
每一個原型都有一個constructor屬性指向關聯的構造函數
圖片描述對象

實例和原型
當讀取完實例的屬性是,若是找不到,就會查找與對象關聯的原型中的屬性,若是找不到,就回去原型中去查找blog

function Person() {

}

Person.prototype.name = 'Kevin';

var person = new Person();

person.name = 'Daisy';
console.log(person.name) // Daisy

delete person.name;
console.log(person.name) // Kevin

原型的原型
在前面,咱們已經講了原型也是一個對象,既然是對象,咱們就能夠用最原始的方式建立它,那就是:圖片

var obj = new Object();
obj.name = 'Kevin'
console.log(obj.name) // Kevin

其實原型對象就是經過 Object 構造函數生成的,結合以前所講,實例的 proto 指向構造函數的 prototype ,因此咱們再更新下關係圖:

圖片描述

原型鏈

那 Object.prototype 的原型呢?

null,咱們能夠打印:

console.log(Object.prototype.__proto__ === null) // true

然而 null 究竟表明了什麼呢?

引用阮一峯老師的 《undefined與null的區別》 就是:

null 表示「沒有對象」,即該處不該該有值。
因此 Object.prototype.__proto__ 的值爲 null 跟 Object.prototype 沒有原型,其實表達了一個意思。

因此查找屬性的時候查到 Object.prototype 就能夠中止查找了。

最後一張關係圖也能夠更新爲:
圖片描述

相關文章
相關標籤/搜索