任何人都可以向我解释这段代码
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
答案 0 :(得分:4)
constructor
是prototype
对象的属性:
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