2011-03-23 119 views
0
<script> 
function ClassA() 
{ 
    this.a=function(){alert();}; 
} 
function ClassB() 
{ 
    this.b=function(){alert();}; 
} 
ClassB.prototype=new ClassA(); 
var objB1=new ClassB(); 
var objB2=new ClassB(); 
alert(objB1.a==objB2.a); 
alert(objB1.b==objB2.b); 
</script> 

为什么第一个警报是真的,第二个是错误的?谢谢关于javascript中原型的问题

回答

2

因为属性“a”不是ClassB实例的直接属性(即,objB1.hasOwnProperty(“a”)为false),所以从其原型读取属性。由于ClassB的所有实例只有一个原型对象,因此objB1.a和objB2.a实际上指的是在其公共原型对象中定义的相同函数。 (你可以验证objB1.a===objB2.a)。

但是属性“b”被定义为每个ClassB的每个实例的新函数,而单独的函数实例并不相等。

+0

谢谢你。你的答案很好。 – jsnewman 2011-03-23 02:51:25

0

Upvoted @ maerics的(好)答案,但要指出一些可能不明显的东西。 (构造函数)函数内部,this引用正在创建的新实例。因此,每次调用new ClassAnew ClassB时,都会创建一个新实例,并且this.athis.b引用分配给新实例化对象的属性的新函数。

因此,看着你的代码,一个简单的问题就是问自己:“每种类型有多少新的实例正在创建?”

我看到的new ClassA()只有一个发生,这意味着只是一个被创建的ClassA实例,因此,只有一个功能分配给this.a。但是,我看到两个发生了new ClassB(),因此,两个创建了新函数,每个实例一个。

+0

谢谢你的帮助。 – jsnewman 2011-03-23 02:51:56