JS function 是函數也是對象, 淺談原型鏈

JS function 是函數也是對象, 淺談原型鏈

JS 惟一支持的繼承方式是經過原型鏈繼承, 理解好原型鏈很是重要, 我記錄下個人理解函數

1. 前言

  1. new 出來的實例有 _proto_ 屬性, 而且指向其構造函數的 prototype 對象spa

    function Person(){}
    const person = new Person();
    person.__proto__ === Person.prototype // true
  2. 全部 new 出來的實例有 _proto_ 屬性, 全部函數有 prototype 屬性prototype

  3. 不要小看任何一個對象, 這個對象有多是一個函數; 不要小看任何一個函數, 這個函數有可能也是一個對象code

  4. 只要是對象, 必定就有相應的構造函數 ( 除了 Object 的原型對象找不到 )對象


2. 有趣的部分

  1. function 是函數, 但也是對象
  2. Object 是函數, 但也是對象
  3. 看一個對象是否是函數, 就看它有沒有 prototype 屬性, 像原型對象沒有, 它就只是單純的對象, 不是函數 ( 原型對象無原型 )
  4. Function 是函數, 也是對象, 而且它做爲對象的 _proto_ 屬性 等於 它做爲函數的 prototype 屬性, 這說明, 它 本身建立本身

3. 解釋

  1. 以這個爲例blog

    function Person(){}
    const person = new Person();

  2. function 是函數, 但也是對象繼承

    • 是函數
    Person.prototype  // {constructor: ƒ ...}
    
    Person.prototype.constructor === Person // true

    這說明 Person 是函數, 有原型, 原型的 constructor 指向本身原型鏈

    • 是對象
    Person.__proto__  // ƒ () { [native code] }
    
    Person.__proto__ === Function.prototype //true

    這說明 Person 是對象, 至關於 Person = new Function() , 有沒有那味了呢原型


  3. 原型對象是單純的對象, 不是函數io

    Person.prototype.prototype  // undefined 不是函數, 無原型
    
    Person.prototype.__proto__  // {constructor: ƒ...} 
    
    Person.prototype.__proto__ === Object.prototype  // true

    原型對象無原型, 說明原型對象就只是一個對象, 是對象確定就有構造函數, 其構造函數是 Object, 至關於 Person.prototype = new Object()


  4. Object 是函數, 但也是對象

    Object.prototype  // {constructor: ƒ ...} 是函數, 有原型
    
    Object.prototype.__proto__  // null 全部對象都有其構造函數,  Object 原型對象例外
    
    Object.__proto__  // ƒ () { [native code] } Object 是對象
    
    Object.__proto__ === Function.prototype  // true

    Object 有原型對象, 說明它是個函數, 而且它的原型是惟一一個找不到構造函數的; Object 是對象, 有本身的構造函數, 而且它的構造函數是 Function. 至關於 Object = new Function()


  5. Function 是函數, 也是對象, 而且它本身建立本身

    Function.prototype  // ƒ () { [native code] } 是函數
    
    Function.__proto__  // ƒ () { [native code] } 是對象
    
    Function.__proto__ === Function.prototype  // true
    
    Function.prototype.__proto__ === Object.prototype  // true

    通過前面的討論, 從這個代碼能夠看出, Function 便是函數也是對象, 而且至關於本身建立了本身, 至關於 Function = new Function(); ; Function 的原型對象的構造函數也是 Object, 至關於 Function.prototype = new Object()


4. 關係圖

繼承關係

new 的見解, new 出來的對象必定有 _proto_ 指向其構造函數的 prototype.

Function = new Function();
Object = new Function();
Person = new Function();
全部的原型對象 = new Object(); // 非繼承, 人爲修改後會發生變化
person = new Person();
相關文章
相關標籤/搜索