通常咱們看到prototype就會下意識的說這不就是原型對象嘛?可是大家真的瞭解prototype嘛?就當大家很瞭解了,畢竟是基礎知識,我就簡單說說函數
先說說工廠模式的由來吧,建立對象咱們一般能夠用new Object()或者直接對象字面量{}建立,可是要是對象之間又有其餘共用的代碼塊又將如何呢?不錯,這會形成大量的代碼冗餘,由於在JS的世界裏沒有接口的概念(ES5以前),咱們平時在JS所說的類也並不是實際意義上的類,不少類的特性JS都沒有,我通常就把JS的類稱爲一個"另類",雖然ES6有了所謂的接口,可是萬變不離其宗。扯得有點遠啊,既然普通建立對象會形成冗餘,那怎麼避免呢?起初用的是工廠模式,如demo1所示:this
function demo1 () { this.name = 'mirok', this.show = show } function demo2 () { this.name = 'july', this.show = show } function show () { console.log(this.name) } var name = 'global' new demo1().show() //mirok new demo2().show() // july show() //global
雖然demo1解決了問題,可是這樣寫沒有任何封裝而言, show函數並非引用類型特定能訪問的,如demo1輸出了global同樣,爲了解決此類問題,便有了原型模式,也就是大家常常用的prototypeprototype
function Demo2 () { } Demo2.prototype.show = function() { console.log(this.name) } var obj1 = new Demo2() var obj2 = new Demo2() obj1.name = 'mirok' obj2.name = 'july' obj1.show() //mirok obj2.show() // july
網上有不少解釋了__proto__和prototype的區別,還各自寫了例子,雖說了不少,也是解釋得不清不楚。咱們知道建立了一個函數就帶了一個prototype屬性,建立一個實例就帶着一個[[prototype]]指針,這個指針是實例和構造函數的原型對象間的聯繫,這個指針在腳本中是不可見的,也就是你不能訪問的,可是在Firefox、Safari 和 Chrome中,提供了__proto__來支持訪問,這麼一說,相信你們應該能明白吧指針