Javascript之constructor

將今天的小實驗記錄在此。時間久了,prototype和constructor的區別也分不清了,遂有了如下的小實驗。php

1. 打開chrome, 查看window對象html

window.constructor
function Window() { [native code] }
 
window.__proto__
Window {postMessagefunctionclosefunctionblurfunctionfocusfunctionondeviceorientationnull}
 
從這能夠看出一些端倪,constructor返回的是一個function, 而prototype返回是一個對象。
 
2. 繼續推斷,window對象是由constructor指向的這個function產生的。作三個實驗,
 
第一個,
//這個function返回一個只有name屬性的對象
function objConstructor(){
  return { name:"object" };
}
 
var obj = objConstructor();
 
//如今來檢查obj.constructor,是Object對象。
obj.constructor
function Object() { [native code] }
 
第二個
/這個function返回一個只有name屬性的對象
function objConstructor(){
 this.name = "object";
}
 
var obj = objConstructor();
 
//如今來檢查obj.constructor,錯誤!沒有constructor, obj此時爲null。
 
第三個
/這個function返回一個只有name屬性的對象
function objConstructor(){
 this.name = "object";
}
 
var obj = new objConstructor();
 
//如今來檢查obj.constructor,這個是咱們想要。
obj.constructor
function objConstructor(){  this.name = "object"; }
 
3. 如今來看constructor的定義: The constructor property is a reference to the function that created an object. 怎麼建立一個對象?new一個。那你用了建立對象的那個function也就成了constructor。
 
再來想一想爲何例子一的constructor是Object對象呢?由於 {name:"object"} 等同於 new Object({name:"object" })。
 
4. 關於constructor和prototype的關係,能夠看這個博客,解釋的比較清楚:http://www.cnblogs.com/phpmix/articles/1734031.html
 
實際上constructor也是prototype的一個屬性: obj.constructor = obj.prototype.constructor。這樣就不用太糾結於constructor和prototype了。因此若是objConstructor的prototype改變了,則是有可能影
響obj.constructor的。
例如:
function objConstructor(){
 this.name = "object";
}
 
objConstructor.prototype = new Object({name:"prototype"});
 
var obj = new objConstructor();
 
//如今來檢查obj.constructor,constructor變成了Object對象。
obj.constructor
function Object() { [native code] }
相關文章
相關標籤/搜索