【发布时间】:2017-03-23 21:28:55
【问题描述】:
在我当前的 Web 项目中,我正在处理多个 JavaScript 文件,每个文件都包含从其他类型继承的类型定义。所以在任何给定的文件中,我都可以有类似 ...
function Type(){
ParentType.call(this);
}
Type.prototype = Object.create( ParentType.prototype );
Type.prototype.constructor = Type;
...ParentType 在另一个文件中类似声明:
function ParentType(){
this.data = "";
}
由于在 <head> 标记中处理许多 JavaScript 文件变得很麻烦,我编写了一个 bash 脚本来将这些文件连接成一个文件(称为 master.js)。这样,我可以在我的 HTML 中链接单个文件。
对于只有一个子类型的类型,无论我的文件的串联顺序如何,原型链都会正确构建。也就是说,这个sn-p ...
function ParentType(){
this.data = "";
}
function Type(){
ParentType.call(this);
}
Type.prototype = Object.create( ParentType.prototype );
Type.prototype.constructor = Type;
... 行为与此 sn-p 相同:
function Type(){
ParentType.call(this);
}
Type.prototype = Object.create( ParentType.prototype );
Type.prototype.constructor = Type;
function ParentType(){
this.data = "";
}
当我在任一情况下创建Type 的实例时,ParentType.prototype.isPrototypeOf(typeobj) 返回 true(其中typeobj 是我的Type 实例)。
但是,当我将另一种类型添加到“原型链”的末尾时,它仅在文件按顺序连接时才有效,即:
function ParentType(){
this.data = "";
}
function Type(){
ParentType.call(this);
}
Type.prototype = Object.create( ParentType.prototype );
Type.prototype.constructor = Type;
function ChildType(){
Type.call(this);
}
ChildType.prototype = Object.create( Type.prototype );
ChildType.prototype.constructor = ChildType;
... 否则,链条会“断裂”。我猜测为什么这在单子场景中是可以的,因为这两个类型定义都被提升了,并且只有一组 statements 需要担心原型链。但是对于多链原型链,如果语句乱序,链就无法正常连接。
所以我真正要问的是,有没有一种方法可以在 JavaScript 中实现继承,而不管文件连接的顺序如何?我的第一个想法是 @987654333 @ 和 extends 的做事方式,但后来我了解到,即使 class 定义也没有被提升!
注意:我所说的“作品”是指子类型从(所有)它们的父类继承函数/值,并且isPrototypeOf 在检查其任何父类的原型时为任何对象返回 true。
【问题讨论】:
标签: javascript inheritance prototype hoisting