在JavaScript中,萬物皆對象。對象分爲普通對象和函數對象,那麼怎麼區分普通對象和函數對象呢?函數
function是js中自帶的函數對象。經過new function()建立的對象都是函數對象。其餘的都是普通對象。this
<script> var a1 = function(){}; var a2 = new Function('小明'); function a3(){}; var b1 = {}; var b2 = new Object(); var b3 = new a3(); console.log(typeof a1);//function console.log(typeof a2);//function console.log(typeof a3);//function console.log(typeof b1);//object console.log(typeof b2);//object console.log(typeof b3);//object </script>
從上面代碼中能夠看出a1,a2,a3爲函數對象,b1,b2,b3爲普通對象。spa
在JavaScript中每當定義一個函數對象,對象都會包含一些預約義的屬性,每一個函數都有一個prototype屬性(原型屬性),這個屬性是一個指針,指向一個對象(原型對象),注:普通對象沒有prototype,但有__proto__屬性。prototype
如今建立一個函數看看,原型是什麼?指針
<script> var test=function(){}; console.log(test.prototype);//object{} </script>
咱們能夠看到原型就是一個空的對象,既然是一個對象,咱們就能夠爲他添加屬性和方法。code
<script> var test=function(){}; test.prototype.getName=function(){ return this.name; } </script>
原型對象是用來作什麼的呢?主要做用是用於繼承。舉了例子:對象
var cart= function(name){ this.name = name }; cart.prototype.getName = function(){ return this.name; } var myCart= new cart(‘蘭博基尼’); myCart.getName(); //蘭博基尼
咱們能夠看到,原型對象上添加的屬性和方法,在函數建立的實例中依然可使用,這說明什麼?blog
原型對象中的屬性和方法是全部實例共享的。繼承
JS在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__的內置屬性,用於指向建立它的函數對象的原型對象prototype。以上面的例子爲例:ip
<script> var test=function(){}; test.prototype.name="小明"; test.prototype.sex="男"; test.prototype.getName=function(){ console.log(this.name); } var a1=new test(); console.log(test.prototype); console.log(a1); </script>
咱們能夠看到,test的原型對象和一個實例對象都有一個__proto__對象,可是指向不一樣,原型對象中的__proto__指向Object,而實例中的__proto__指向內部明叫test的對象,展開這個對象能夠看到就是原型對象。就是說每個實例中有一個__proto__屬性指向原型對象。每個實例的內部都包含一個內部屬性__proto__,指向了構造函數的原型,就是這個屬性鏈接了實例和原型對象之間的關係,而且咱們知道實例中不包含name屬性和getName方法,可是咱們卻使用了getName(),就是經過這個__proto__屬性查找的。
JS在建立對象(不管是普通對象仍是函數對象)的時候,都有一個叫作__proto__的內置屬性,用於指向建立它的函數對象的原型對象prototype。 console.log(zjh.__proto__ === person.prototype) //true 一樣,person.prototype對象也有__proto__屬性,它指向建立它的函數對象(Object)的prototype console.log(person.prototype.__proto__ === Object.prototype) //true 繼續,Object.prototype對象也有__proto__屬性,但它比較特殊,爲null console.log(Object.prototype.__proto__) //null 咱們把這個有__proto__串起來的直到Object.prototype.__proto__爲null的鏈叫作原型鏈
使用方法a.isprototypeOf(b),判斷對象a是不是實例b__proto__指向的原型對象,若是是返回true,不然返回false。看個例子
var test = function test(){} test.prototype.name = "小明"; test.prototype.age = "25"; test.prototype.getName = function(){console.log(this.name);} var o1 = new test(); console.log(test.prototype.isPrototypeOf(o1));//true
1.原型和原型鏈是JS實現繼承的一種模型。2.原型鏈的造成是真正是靠__proto__ 而非prototype。