将今天的小实验记录在此。时间久了,prototype和constructor的区别也分不清了,遂有了以下的小实验。
1. 打开chrome, 查看window对象
window.constructor
function Window() { [native code] }
window.__proto__
Window {postMessage: function, close: function, blur: function, focus: function, ondeviceorientation: null…}
从这可以看出一些端倪,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] }
浙公网安备 33010602011771号