說到這兩個屬性,那不得不說一下_proto_這個屬性,一般這個屬性是隱藏屬性,是不容許被暴露的,而某些瀏覽器爲了開發者可以很好的理解,而將這個屬性暴露出來,好比Mozilla FireFox,這就是爲何有些同窗在個人上一節文章測試代碼的時候打印不出來了。
不扯遠了,先來看一下instanceof 這個關鍵字,學過java相似的高級語言都應該知道吧 instancaof是用來檢測這個實例是否是由這個類所建立的,換言之,就是檢測這個實例對象是否是這個類new出來的。
看一段代碼java
function A(){}; var a = new A(); alert(a instanceof A);
你會發現alert出來的是true ,這正是體現了instanceof的做用了。
接下來咱們改動一下_proto_瀏覽器
function A(){}; var a = new A(); a.__proto__ = {}; alert(a instanceof A);
咱們讓a._proto_指向了一個空對象,而下面alert出來的倒是false了,到這裏咱們就大概知道了instanceof的做用了,instanceof就是用來檢測當前對象是否在原型鏈上的關鍵字,換言之,就是用來檢測當前對象的_proto_屬性是否指向了建立它的對象的prototype所指向的那塊內存。因此這裏就很好解釋了,爲何更改了一下_proto_就可使結果變爲false。
畫個示意圖,其實這個很好理解的
測試
function A(){}; var a = new A(); alert(a.constructor);
接下來你會在屏幕上看到function A(){}; 這就是constructor 這個屬性的做用了
這樣看來的話它和 instanceof 關鍵字確實有些相像,但是若是你仔細觀察的話你會發現constructor只是個屬性,而就於js而言,屬性值是能夠隨時改變的,因此說,constructor具備不肯定性,可是一般的話這個值是指向建立當前實例的對象的
而instanceof只返回一個boolean類型的值,沒法獲取建立當前實例的對象,因此利用constructor可使建立當前實例的對象暴露出來,從而能夠對它進行修改。prototype