prototype修改添加位置的影响

第一个问题:

<script>
function Place()
{
	Place.prototype.name="old\n";
}
var a=new Place();
document.write(a.name);
Place.prototype.name="new\n";
document.write(a.name);
var b=new Place();
document.write(a.name);
</script>

最后的结果是old new old ,为什么呢,很多人一开始认为是old,new,new

在第6行中,var a=new Place();,将Place.prototype.name="old\n"

在第8行中,Place.prototype.name="new\n";

在第10行中,又重复了第六行的事情。这就是为什么是这个答案了。

所以说,原型尽量在构造函数之外进行设置,添加。在构造函数添加中修改,后来的的改变,因为再一次进行构造,将原来的设置都改变。或者使用原型动态模式,在构造函数中,进行查找是否拥有了某一个方法或者属性,然后再根据条件进行添加修改。


第二个问题:

<script>
function SuperSub()
{
	this.name="1";
	SuperSub.prototype.name="2";
}
function Sub()
{
	Sub.prototype=new SuperSub();//放置在内部,下面输出的是undefined。
}
var a=new Sub();
document.write(a.name);
</script>

同样是下面的东西


<script>
function SuperSub()
{
	this.name="1";
	SuperSub.prototype.name="2";
}
var b=new SuperSub();
function Sub()
{
	Sub.prototype=b;//放置在内部,下面输出的是undefined。
}
var a=new Sub();
document.write(a.name);
</script>

这到底是因为什么呢,我们紧跟着下面看,下面的代码。

<script>
function person()
{
}
function personson()
{
	personson.prototype=new person();
}

//document.write("prototype" in person);
var a=new personson();
document.write(person.prototype.isPrototypeOf(a));
document.write(personson.prototype.isPrototypeOf(a));
</script>

结果是falsefalse。他的原型两个都不是,我们就很清楚刚才上面的输出为undefined的。我们这里就有疑问,为什么是false呢。好吧,这里我也搞不清楚,为什么?只需要记得,继承的需要将原型修改设置函数外面。

第三个问题:

这里是prototype对象字面量的位置

<script>
function person()
{
}
function personson()
{
	
}
personson.prototype=new person();
person.prototype={
	name:"mark"
};
var a=new person();
var b=new personson();
//document.write("name" in a);
document.write(a.name);
document.write(b.name);
person.prototype={
	name:"Jim",
	age:10
};document.write(a.name);
document.write(b.name);
</script>

最后的答案是markundefinedmarkundefined
下面的代码仅仅是调换了几行顺序,就大不一样。


<script>
function person()
{
}
function personson()
{
}
person.prototype={
	name:"mark"
};
personson.prototype=new person();


var a=new person();
var b=new personson();
//document.write("name" in a);
document.write(a.name);
document.write(b.name);
person.prototype={
	name:"Jim",
	age:10
};
document.write(a.name);
document.write(b.name);
</script>

但是结果是markmarkmarkmark
突然,我们紧接着,发现为什么四次输出同一样呢,是不是后面的一次原型没有修改,我们紧接着下面的测试。
我们在最后的添加一句代码

document.write(person.prototype.name);

这个输出的是Jim。

我们可以知道,其实整个person的原型已经改变,只不过是原先的对象,还是保留着原先的原型,_proto_指向第一次的对象字面量构造出来的原型。我们在使用对象字面量时候,要在没有构造对象之前使用,而且一旦有对象生成之后,就不要再使用这种方法,导致原先的对象和后来的对象的原型不一致。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值