<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>
为什么第一个警报是真的而第二个是假的?感谢
答案 0 :(得分:2)
因为属性“a”不是ClassB实例的直接属性(即objB1.hasOwnProperty(“a”)为false),所以从其原型中读取属性。由于ClassB的所有实例只有一个原型对象,因此objB1.a和objB2.a实际上是指同一个函数,在它们的公共原型对象中定义。 (您可以验证objB1.a===objB2.a
)。
但属性“b”被定义为ClassB的每个实例的新函数,并且单独的函数实例彼此不相等。
答案 1 :(得分:0)
Upvoted @ maerics(好)答案,但想要指出可能不明显的事情。在(构造函数)函数内部,this
指的是正在创建的新实例。因此,每次调用new ClassA
或new ClassB
时,都会创建一个新实例,this.a
或this.b
引用分配给新实例化对象的属性的新函数。
所以,看看你的代码,一个问自己的简单问题是:“每种类型的新实例有多少?”
我只看到一次new ClassA()
,这意味着只创建了{em>一个 ClassA
的实例,因此,只有一个函数被分配给this.a
。但是,我看到两个出现new ClassB()
,因此,两个新函数被创建,每个实例一个。