一篇完全理解JS中的prototype、__proto__與constructor

1.基本類型不是對象(boolean、undefined、number、string)
2.引用類型都是對象(Array,function ,Object)
3.對象是經過函數建立,而且強調,對象字面量也是經過函數建立,舉例說明,ES6繼承的語法糖
4.函數有的是顯式原型prototype  
5.對象有的是隱式原型__proto__     和構造器 constructor
6.可是因爲JS中函數也是一種對象,因此函數也擁有__proto__和constructor
7.__proto__ 屬性,它是對象所獨有的,能夠看到__proto__屬性都是由一個對象指向一個對象.
它的做用就是當訪問一個對象的屬性時,若是該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(能夠理解爲父對象)裏找,若是父對象也不存在這個屬性,則繼續往父對象的__proto__屬性所指向的那個對象(能夠理解爲爺爺對象)裏找,若是還沒找到,則繼續往上找…直到原型鏈頂端null(能夠理解爲原始人。。。),再往上找就至關於在null上取值,會報錯(能夠理解爲,再往上就已經不是「人」的範疇了,找不到了,到此結束。
8.prototype屬性,它是函數所獨有的,它是從一個函數指向一個對象。它的含義是函數的原型對象,也就是這個函數(其實全部函數均可以做爲構造函數)所建立的實例的原型對象,它的做用就是包含能夠由特定類型的全部實例共享的屬性和方法,也就是讓該函數所實例化的對象們均可以找到公用的屬性和方法。任何函數在建立的時候,其實會默認同時建立該函數的prototype對象。
8.constructor屬性也是對象才擁有的,它是從一個對象指向一個函數,含義就是指向該對象的構造函數,每一個對象都有構造函數(自己擁有或繼承而來,繼承而來的要結合__proto__屬性查看會更清楚點
舉慄:
  class Person {
    constructor(name) {
      this.name = name;
    }
  }
  var xiaoming = new Person('張三');
  console.log(xiaoming);

輸出結果:
Person {name: "張三"}
   name: "張三"
   __proto__: Object

__proto__就是由xiaoming(實例對象)指向Person 對象。

舉慄:
console.log(xiaoming.__proto__);

輸出結果:
{constructor: ƒ}
   constructor: ƒ Person(name)
   arguments: (...)
   caller: (...)
   length: 1
   name: "Person"
   prototype: {constructor: ƒ}
    __proto__: ƒ ()
    [[FunctionLocation]]: index.vue?0dbc:133
     [[Scopes]]: Scopes[3]
     __proto__: Object
  裏面的構造器指向的是Person裏面的構造函數,由於是函數,因此有prototype(顯式原型)

舉慄:
  console.log(xiaoming.__proto__.__proto__);


輸出的是:
{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}
 constructor: ƒ Object()
  hasOwnProperty: ƒ hasOwnProperty()
  isPrototypeOf: ƒ isPrototypeOf()
  propertyIsEnumerable: ƒ propertyIsEnumerable()
  toLocaleString: ƒ toLocaleString()
  toString: ƒ toString()
  valueOf: ƒ valueOf()
  __defineGetter__: ƒ __defineGetter__()
  __defineSetter__: ƒ __defineSetter__()
  __lookupGetter__: ƒ __lookupGetter__()
  __lookupSetter__: ƒ __lookupSetter__()
  get __proto__: ƒ __proto__()
  set __proto__: ƒ __proto__()
 尋找構造函數的原型,由於函數也是一個引用類型,因此構造函數指向Object對象

舉慄:
  console.log(xiaoming.__proto__.__proto__.__proto__);

已無隱式原型,內存地址指向空對象指針,輸出null

 

相關文章
相關標籤/搜索