首页 > 关于原型prototype

关于原型prototype

为什么下面代码的输出结果的情况会不一样:

var Box = {};
box.prototype.name = "xee";
box.prototype.study = {
   return this.name;
}
var box = new Box();
alert(box.prototype);  //结果是Undefiled
alert(box.constructor);  //这个却是 Object,constructor不也是要通过_proto_指针访问的吗?为什么他却不是Undefiled

首先你要知道变量声明提升
var Box = {};
box.prototype.name = "xee";
box.prototype.study = {
return this.name;
}
var box = new Box();
执行过程其实是这样:
var Box = {};
var box=undefined;//box声明提升,取得undefined值。box也是一个对象,只不过现在为undefined
box.prototype.name = "xee";
box.prototype.study = {
return this.name;
}
重点来了!!!
var box = new Box();//重写了对象,Box对象里面是空的,没有其他属性;当然也没有继承
所以:alert(box.prototype); ->结果是Undefiled
而box指针此时不为空,所以alert(box.constructor); ->这个却是 Object


你没发现你这段代码根本运行不了吗,有报错的。
首先有关错误:
1,你想写在“box”原型上的study()函数格式就错了,导致this报错,应该是box.prototype.study = function(){return this.name;}
2,在修改完了问题1之后,第二行的prototype属性会报错,因为box不是函数(构造函数),而函数才有prototype属性,所以box没有prototype属性,因此在上面再添加name属性与study函数便会报错。
3,Box也不是构造函数,所以根本不能在上面new出对象,会直接报错。
其次你的结果:
1,上面第2点已说明,box没有prototype属性,所以alert(box.prototype)结果是undefined。
2,根据上面的第三点,box根本没有指向任何new出来的对象。所以也不会是Object,至于你的Object是怎么来的,我比较好奇。
另外,根据你的意图,我猜你是想将Box作为构造函数,并给其原型对象添加name属性与study方法吧,然后new出Box对象,看new出来的对象的prototype属性与constructor属性吧,如果是这样,正确的写法应该是:
function Box(){}
Box.prototype.name="xee";
Box.prototype.study= function(){

return this.name;

}
var box = new Box();
alert(box.prototype);
alert(box.constructor);
这样的话,box.constructor的值就是function Box(){}也就是构造函数了,当然也是Object


我想你还是好好看看js面向对面的文档吧,你的概念很模糊。
对象字面量没有prototype属性。对象字面量是工厂模式的写法。构造函数才能用prototype。

var box = function(){}
box.prototype.name = 'lame';
box.prototype.study = function(){
return this.name;
}
下面的
var box2 = new box()
其实只是实例化了一次box对象,所以也没有prototype。constructor指向box。

【热门文章】
【热门文章】