JavaScript原型與原型鏈

1、數據類型

JavaScript的數據類型能夠分爲基本數據類型和引用數據類型。編程

  1. 基本數據類型(6種)函數

    • String
    • Number
    • Boolean
    • null
    • undefined
    • Symbol(ES6)
  2. 引用數據類型this

    • Object

2、面向對象編程

  1. 構造函數spa

    • 面向對象編程的第一步,就是要生成對象。前面說過,對象是單個實物的抽象。一般須要一個模板,表示某一類實物的共同特徵,而後對象根據這個模板生成。
    • JavaScript 語言使用構造函數(constructor)做爲對象的模板。所謂」構造函數」,就是專門用來生成實例對象的函數。它就是對象的模板,描述實例對象的基本結構。一個構造函數,能夠生成多個實例對象,這些實例對象都有相同的結構。
  • 構造函數就是一個普通的函數,爲了與普通函數區別,構造函數名字的第一個字母一般大寫。prototype

    構造函數的特色有兩個。code

    • 函數體內部使用了this關鍵字,表明了所要生成的對象實例。
    • 使用new命令生成對象。

2. new命令
new命令的做用,就是執行構造函數,返回一個實例對象。對象

new 命令的原理blog

  1. 建立一個空對象,做爲將要返回的對象實例。
  2. 將這個空對象的原型,指向構造函數的prototype屬性。
  3. 將這個空對象賦值給函數內部的this關鍵字。
  4. 開始執行構造函數內部的代碼。

若是構造函數內部有return語句,並且return後面跟着一個對象,new命令會返回return語句指定的對象;不然,返回this對象。ip

var Fn=function(){
    this.name='xxx';
    this.old=18;
}
var f1=new Fn();
console.log(f1.name);//xxx
console.log(f1.old);//18

上面代碼經過new命令,讓構造函數Fn生成一個實例對象,保存在變量f1中。這個新生成的實例對象,從構造函數Fn獲得了name和old屬性。new命令執行時,構造函數內部的this,就表明了新生成的實例對象,this.name和this.old是實例對象的屬性。原型鏈

var Fn2=function(){
    name='xxx';
    old=18;
}
var f2=new Fn2();
console.log(f2.name);//undefined
console.log(f2.old);//undefined
f2.name='yyy';
console.log(f2.name);//yyy

3、原型與原型鏈

對象是函數建立的,而函數卻又是一種對象。也是屬性的集合,能夠對函數進行自定義屬性。
每一個函數都有一個屬性叫作prototype。
這個prototype的屬性值是一個對象,默認的只有一個叫作constructor的屬性,指向這個函數自己。

var Fn=function(){
    this.name='xxx';
    this.old=18;
}

clipboard.png

回到上面new命令的原理的第二條,從這張圖能夠看到對象的原型,指向構造函數的prototype屬性。

f1.__proto__指向構造函數的prototype屬性,就是對象的原型。因此f1.__proto__===Fn.prototype爲true

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

clipboard.png

左邊爲Fn函數,右邊就是它的原型

在上面能夠看到f1.__proto__===Fn.prototype的結果爲true
__proto__就是指向構造函數的prototype屬性,Fn.prototype就是對象的原型

即,每一個由構造函數建立的對象都有一個__proto__屬性,指向建立該對象的函數的prototype。

基於以上,咱們獲得一個重要的公式
var 對象名 = new 函數名()
對象名.__proto__=== 函數名.prototype

小結

  1. 自定義函數.__proto__指向Function.prototype
  2. Object.__proto__指向Function.prototypeObject.__proto__ === Function.prototype//true
  3. Function.__proto__指向Function.prototype:Function也是一個函數,函數是一種對象,也有__proto__屬性。既然是函數,那麼它必定是被Function建立。因此Function是被自身建立的。因此它的__proto__指向了自身的Prototype。
  4. Function.prototype.__proto__===Object.prototype//true
  5. Object.prototype的__proto__指向的是null

總結

  1. 對象是函數建立的,而函數卻又是一種對象。也是屬性的集合
  2. 每一個函數都有一個屬性叫作prototype。
  3. 對象的原型,指向構造函數的prototype屬性。
  4. prototype的屬性值是一個對象,默認的只有一個叫作constructor的屬性,指向這個函數自己。
  5. 原型既然做爲對象,屬性的集合,能夠自定義的增長許多屬性。

總之記住下面這幾個要點

  1. Object對象是由Function函數建立的
  2. 全部函數都是由Function建立的,函數也是對象
  3. 重要的公式

    • var 對象名 = new 函數名()
    • 對象名.__proto__=== 函數名.prototype
  4. 普通函數的prototype屬性值是一個對象
  5. Function.prototype有__proto__這個屬性
  6. Object.prototype.__proto__===null結果爲true
相關文章
相關標籤/搜索