構造對象,原型和原型鏈筆記

面向對象:面向對象、原型
對原型、原型鏈、 Function、Object 的理解
什麼是 JS 原型鏈?
轉載以上文章編程

1、OOP(Object-oriented programming, 面向對象編程)

一、wiki的解釋

面向對象編程(OOP)是一種基於「對象」概念的編程範式。該對象包含數據(屬性),以及一些執行過程的代碼(即方法)。對象的一個特性是,調用對象的方法過程能夠訪問並常常修改與其關聯的對象的數據字段(對象具備「this」或「self」的概念)。數組

二、面向對象的思路:

把某個功能當作一個總體(對象),經過調用對象的某個方法來啓動功能。在用的時候不去考慮這個對象內部的實現細節,在去實現這個對象細節的時候不用管誰在調用瀏覽器

三、例子

面向對象的寫法

Car.擰鑰匙()
Car.掛擋()
Car.踩油門()

2、構造對象

一、代碼

經過new 函數名('參數,參數')獲得一個對象,就至關於這個對象就是這個函數構造出來的,這個對象是函數的實例函數

function Person(name) {
    this.name = name
    this.sayName = function() {
        console.log(this.name)
    }
}
var p = new Person('hunger')

二、instanceof

instanceof是一個操做符,能夠判斷對象是否爲某個函數的實例this

p1 instanceof Person; // true
p1 instanceof Object;// true

instanceof判斷的是對象,非對象的數據不能判斷spa

1 instanceof Number; // false

三、構造函數的過程

  • 建立一個空對象 {},假設名字是 tmpObj,並空對象的__proto__特性指向函數的prototype屬性
  • 執行 Person 函數,執行過程當中對 this 操做就是對 tmpObj 進行操做
  • 函數執行完後返回剛剛建立的 tmpObj
  • 把 tmpObj 賦值給 p (p也指向同一個對象)

四、構造函數的原型鏈

一、對函數使用new表達式就是構造函數prototype

二、每一個函數都有名稱爲prototype屬性,叫作原型,是一個對象code

三、每一個對象都有一個內部屬性 _proto_(規範中沒有指定這個名稱,可是瀏覽器都這麼實現的) 指向其類型的prototype屬性,類的實例也是對象,其__proto__屬性指向「類」的prototype對象

四、全部實例(對象)都會經過原型鏈引用到類型(函數)的prototype(原型),prototype至關於特定類型全部實例均可以訪問到的一個公共容器,通常用來共同調用的函數blog

clipboard.png
總結:

咱們經過函數定義了類Person,類(函數)自動得到屬性prototype
每一個類的實例都會有一個內部屬性__proto__,指向類的prototype屬性

五、舉個栗子

默認狀況下,們寫構造函數是不須要return的,構造函數自動將this表明的對象返回出來!
但若是咱們寫了return語句,若是return是基本類型,會被認爲寫錯了無效。obj1和2仍是this表明的對象。若是return是對象,那構造的對象就等於return後面的對象。
clipboard.png
//obj1={a:1,b:2} obj2={a:1,b:2}

clipboard.png

3、原型和原型鏈

一、查找數組valueof方法,講原型鏈

全部數組都是由Array這個函數構建的。數組的全部方法都是Array.prototype或者他們的原型鏈上面的。當咱們直接賦值的方式生成一個數組的時候,就至關於直接用new Array的方法構建一個對象
clipboard.png

Array函數也是由object函數構建的Array instanceof Object===true
clipboard.png

clipboard.png

數組能夠調用valueof這個方法,但valueof這個方法不在Array.protototype內而是在object.prototype內。
首先 a數組 會找本身的 valueof方法;沒有找到,就會沿着__proto__ 屬性繼續到構造函數 Array 的 prototype 裏找 valueof 方法;若是仍是沒有找到,再繼續往 Array.prototype 的 proto 即 Object.prototype 找 valueof 方法,最後找到 valueof 方法。

總結:一個對象調用其方法,先在本身的自由屬性內去找,找不到就去原型上去找,若是原型內也找不到,就到原型的原型上去找,直到找到該方法。而這構成的鏈就是原型鏈。以下圖

clipboard.png

二、關於原型鏈的規律總結

  1. 當 new 一個函數的時候會建立一個對象,『函數.prototype』 等於 『被建立對象.__proto__』
  2. 一切函數都是由 Function 這個函數建立的,因此『Function.prototype === 被建立的函數.__proto__』
  3. 一切函數的原型對象都是由 Object 這個函數建立的,因此『Object.prototype ===
    一切函數.prototype.__proto__』

建議閱讀若愚老師這邊文章裏面的例子,鞏固印象對原型、原型鏈、 Function、Object 的理解

相關文章
相關標籤/搜索