Javascript奇怪的行为

时间:2011-06-03 15:26:05

标签: javascript inheritance

任何人都可以向我解释这段代码

var ParentClass = function(){
}

var ChildClass = function(){
}

//ChildClass.prototype = new ParentClass();

var child = new ChildClass();
alert(child.constructor === ChildClass); // alert true

但是

var ParentClass = function(){
}

var ChildClass = function(){
}

ChildClass.prototype = new ParentClass();

var child = new ChildClass();
alert(child.constructor === ChildClass); // alert false

4 个答案:

答案 0 :(得分:4)

constructorprototype对象的属性:

var ChildClass = function(){
}

alert(ChildClass.prototype.constructor == ChildClass); // alert true

这种关系现在是这样的:

  +-------------------+           +--------------------+
  |                   |           |                    |
  |ChildClass instance|---------->|ChildClass protoype |
  |                   |           |  constructor prop  |
  +-------------------+           +--------------------+

此属性确实指向ChildClass函数。

如果您覆盖ChildClass.prototype,则会在原型链中查找child.constructor,并参考:

ParentClass.prototype.constructor

因为ChildClass.prototype现在是ParentClass的一个实例,它继承自ParentClass.prototype

  +-------------------+      +--------------------+      +---------------------+
  |                   |      |                    |      |                     |
  |ChildClass instance| ---> |ParentClass instance| ---> |ParentClass prototype|
  |                   |      |                    |      |   constructor  prop |
  +-------------------+      +--------------------+      +---------------------+

ParentClass.prototype.constructor当然会指向ParentClass

答案 1 :(得分:3)

好吧因为在这种情况下你借用了ParentClass的构造函数!这是我在“javascript模式”一书中读到的模式(关于javascript的非常好的书)。

事实上:

var ParentClass = function(){
}

var ChildClass = function(){
}

ChildClass.prototype = new ParentClass();

var child = new ChildClass();
alert(child.constructor === ParentClass)

警报正确!

答案 2 :(得分:1)

这里的行为一点都不奇怪。通常你会看到人们做这样的事情:

var ChildClass = function () {

}

ChildClass.prototype.OftUsedMethod = function () {
  // Something you'll want to be able to do here for every instance of
  // ChildClass, but that you don't want separate instances of the function
  // for.
}

但是因为您已直接分配给ChildClass.prototype而不是分配给成员属性,所以您已经有效地覆盖了ChildClass的基本原型。

答案 3 :(得分:1)

当您覆盖对象的原型时,它也会覆盖构造函数。但是,您可以将其重新设置为原始版本。这样做的是各种图书馆和片段,例如John Resig的Simple Inheritance

var ParentClass = function(){
}

var ChildClass = function(){
}

ChildClass.prototype = new ParentClass();
ChildClass.prototype.constructor = ChildClass;

var child = new ChildClass();
alert(child.constructor === ChildClass); // alert true