一篇徹底理解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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM