總結javascript基礎概念(三):js對象原型鏈

主要問題:
一、構造函數和普通函數有區別麼?什麼區別?
二、prototype和__proto__有什麼不一樣?
三、instanceof的做用機制,爲何有限制?
四、ES6的相關方法,Class繼承原理?函數

3、對象與原型spa

(一)、數據類型
Js共有6種數據類型:prototype

5種基本數據類型 undefined,null,string,number,Boolean
1種複雜數據類型 Object

Object 數據類型能夠分爲兩種:code

函數(包括各類原生、自定義的構造函數):
    Object(),Function(),Array(),Date(),,,
對象實例(由函數建立的) {,,},[,,]...

(二)、建立對象
<script>對象

var Person = function () { };
var p = new Person();

</script>
很簡單的一段代碼,咱們來看看這個new究竟作了什麼?咱們能夠把new的過程拆分紅如下三步:
<1> var p={}; 也就是說,初始化一個對象p。
<2> p.__proto__=Person.prototype;
<3> Person.call(p); 也就是說構造p,也能夠稱之爲初始化p。//執行構造函數的一步blog

說明:對象能夠經過函數來建立。對象都是經過函數建立的。繼承

clipboard.png

每一個函數都有一個prototype屬性,指向一個對象,對象默認只有一個叫作constructor的屬性,指向這個函數自己。ip

clipboard.png

Object是最頂級的構造函數,prototype對象裏面,就有好幾個其餘屬性。原型鏈

clipboard.png

每一個對象都有一個__proto__,可成爲隱式原型。get

clipboard.png

自定義函數的prototype本質上就是普通對象實例,都是被Object建立,因此它的__proto__指向的就是Object.prototype。Object.prototype確實一個特例——它的__proto__指向的是null。

(三)、instanceof

<script>

function B(){};
var A = new B();
console.log(A instanceof B);

</script>

Instanceof運算符的第一個變量是一個對象,暫時稱爲A;第二個變量通常是一個函數,暫時稱爲B。
Instanceof的判斷隊則是:沿着A的__proto__這條線來找,同時沿着B的prototype這條線來找,若是兩條線能找到同一個引用,即同一個對象,那麼就返回true。若是找到終點還未重合,則返回false。
因此instanceof 沒法檢測不一樣iframe建立的對象實例。

(四)、ES6新方法,新特性
Object.setPrototypeOf(),Object.getPrototypeOf()。新增長几個方法直接操做對象的__proto__屬性,實現對象之間的聯繫。
Class的對象語法糖,模仿面向對象的語法,勉強提供了JS中的類的概念。然而並無改變原型鏈的實質,只是更加隱藏的更深。

(五)、繼承與委託與純淨面向對象的語言不一樣,JS本質並無類和實例的概念。JS中一切皆對象(除了少數基本類型),是真正的面向「對象」。構造函數與普通函數並無區別,只是調用方式不一樣。與竭力模仿面向對象的方式來使用JS,使得代碼繼承邏輯十分複雜抽象。相比之下,使用委託的思想,直接修改對象的__proto__屬性指向,來訪問委託對象上的屬性和方法,在邏輯上更簡潔直觀。

相關文章
相關標籤/搜索