第一个问题:
<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);