以前有在本身的文章中談到對象,而說到對象咱們就不可避免的要扯到原型,而且原型也是咱們必須得理解到位的一個點,那接下來咱們就來聊一聊js的原型吧。函數
function person(name,age) { this.name=name; this.age=age; } var a=typeof person.prototype//object var b=typeof person.prototype.constructor//function var c=person.prototype.constructor==person//true
此處咱們首先能夠明確了構造函數和原型對象的關係了吧this
function person(name,age) { this.name=name; this.age=age; } var pengl=new person("pengl",100); var flag=person.prototype.constructor==pengl.constructor;//true
本質:原型對象中的原型兩字是對誰的原型,其實是對於新建的這些對象的原型,是這些對象中那些不變的,共有的東西,好比構造函數,各個對象的區別只是在於經過構造函數新建該對象時,傳入的參數不一樣。而像構造函數或者一些其餘創建在原型上的方法和屬性都是屬於原型級別的,只是新建的對象做爲它的具體實例能夠用而已。prototype
function person(name,age) { this.name=name; this.age=age; this.func=objFunc; function objFunc (argument) { alert("我是屬於新建對象的方法") } } var pengl=new person("pengl",100); pengl.func();
function person(name,age) { this.name=name; this.age=age; } person.prototype.func=function (argument) { alert("我是屬於新建對象原型上的方法") } var pengl=new person("pengl",100); pengl.func();
第一段和第二段的區別就是是否把func方法建立在構造函數中,第一段就是直接在新建對象的級別上建立了一個方法,第二段是在新建對象的原型上建立的方法。從內存的角度看,對於第一段每建立一個對象,就要同時再建立一個func方法,而第二段是,不管建立多少個對象,都只須要一個func方法,這個方法是全部對象所共有的。code
從原型鏈的鏈字咱們就能夠猜到大概是什麼意思,好比咱們使用一個方法,先從該對象上找,若是沒有那麼就從該對象的原型上找,若是該原型沒有,就從該原型的原型上找,以此類推。若是最後都沒找到,則返回undefined對象
pengL->person.prototype->object.prototype->null內存