Javascript中的__proto__、prototype、constructor

今天重溫了下Javacript,給你們帶來一篇Javascript博文,相信對於Javacript有必定了解的人都聽過prototype原型這個概念,今天咱們深度的分析下prototype與__proto__。javascript

好了,下面看一個很是簡單的例子:java

      var Person = function(name)
       {
           this.name = name ;
       };
      var p = new Person("Ben");
      console.log(p.name);
代碼簡單的 你不用說明了,若是如今讓你們根據上面的代碼畫一張包含Function與Object的內存圖,你們確定回想什麼叫包含Function與Object,上面的代碼和它們有幾毛錢的關係。好了,下面我先按要求把圖畫出來,你們參考下:


解析下:函數

一、任何一個由構造器產生的對象都有__proto__屬性,且此屬性指向該構造器的prototype。this

二、全部構造器/函數的__proto__都指向Function的prototypespa

拿第2條對比第1條,貌似咱們發現了什麼,沒錯函數的構造器就是Function,看下面的代碼:prototype

   //函數表達式
       var Person = function(name)
       {
           this.name = name ;
       };
        //函數聲明
        function Person(name)
        {
            this.name = name ;
        }
        //上面兩種方式實際上就至關與new Function
        var Person = new Function("name" , "this.name = name ;" );
固然了不能說說,下面看代碼驗證:

 console.log(Person.__proto__ === Function.prototype);  //true
 console.log(typeof p.__proto__);//objcect
 console.log(p.__proto__.__proto__ === Object.prototype); //true

有人會問,那麼Function與Object的prototype,__prop__究竟是什麼呢?

     console.log(Object.__proto__ === Function.prototype); // true
        console.log(Function.__proto__ === Function.prototype); //true
        console.log(Function.prototype.__proto__ == Object.prototype); //true
        console.log(Object.prototype.__proto__); //null


有此可見code

一、全部的構造器包括Object和Function都繼承了Function.prototype的方法,由第三行可知全部的構造器都是對象,即js中一切皆爲對象。對象

二、__proto__最終的指向都是Object.prototype,這也就是js中的原型鏈。blog


最後咱們看一下Object的文檔:繼承

The following table lists properties of the Object Object.

Property

Description

__proto__ Property

Specifies the prototype for an object.

constructor Property

Specifies the function that creates an object.

prototype Property

Returns a reference to the prototype for a class of objects.

發現Object還有個constructor屬性。

一、constructor屬性指向的是建立當前對象的構造函數。

二、每一個函數都有一個默認的屬性prototype,而這個prototype的constructor默認指向這個函數

看下面的例子:

  //函數表達式
       var Person = function(name)
       {
           this.name = name ;
       };

         var p = new Person("Ben");

        console.log(p.constructor === Person);//true
        console.log(Person.prototype.constructor === Person);  //true
        console.log(Person.prototype instanceof  Object);  //true
        console.log(Person.prototype instanceof  Person);  //false
         //改變Person的prototype
        Person.prototype = {name:"123"} ;
        var p2 = new Person("Ben");
        console.log(p2.constructor === Object);//true
        console.log(p2.constructor === Person.prototype.constructor);//true
        console.log(Person.prototype.constructor === Object);//true
        console.log(Person.prototype.constructor === Person);//false


當改變Person的prototype時,會發現,Person.prototype.constructor指向了Object,主要是由於:

Person.prototype = {name:"123"} 至關於Person.prototype=new Object({name:"123"} );此時的構造器變成了Object.



好了,就介紹到這裏,各位看官沒事留個言,贊一個,哈~。

相關文章
相關標籤/搜索