今天重溫了下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
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 |
---|---|
Specifies the prototype for an object. |
|
Specifies the function that creates an object. |
|
Returns a reference to the prototype for a class of objects. |
一、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.
好了,就介紹到這裏,各位看官沒事留個言,贊一個,哈~。