将今天的小实验记录在此。时间久了,prototype和constructor的区别也分不清了,遂有了以下的小实验。

1. 打开chrome, 查看window对象

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] }