大家真的理解prototype和__proto__嘛?

前言

通常咱們看到prototype就會下意識的說這不就是原型對象嘛?可是大家真的瞭解prototype嘛?就當大家很瞭解了,畢竟是基礎知識,我就簡單說說函數

正文

先說說工廠模式的由來吧,建立對象咱們一般能夠用new Object()或者直接對象字面量{}建立,可是要是對象之間又有其餘共用的代碼塊又將如何呢?不錯,這會形成大量的代碼冗餘,由於在JS的世界裏沒有接口的概念(ES5以前),咱們平時在JS所說的類也並不是實際意義上的類,不少類的特性JS都沒有,我通常就把JS的類稱爲一個"另類",雖然ES6有了所謂的接口,可是萬變不離其宗。扯得有點遠啊,既然普通建立對象會形成冗餘,那怎麼避免呢?起初用的是工廠模式,如demo1所示:this

demo1

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

demo2

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__來支持訪問,這麼一說,相信你們應該能明白吧指針

相關文章
相關標籤/搜索