要使下面的代码生效,我必须将Child
构造函数移到测试函数之外,或者在调用new Child()
之前将它放在test
函数内部。在当前位置,运行代码时将获得TypeError: this.init is not a method
。
在哪里可以找到有关何时评估函数中函数声明的详细信息?
document.addEventListener('DOMContentLoaded', function() {
test()
}, false)
function test() {
// Child declaration can go here
var child = new Child()
// If Child is placed here, this.init is undefined
function Child() {
this.init()
}
Child.prototype = new Ancestor(Child)
}
function Ancestor(constructor) {
this.constructor = constructor
}
Ancestor.prototype.init = function init() {
console.log(this)
}
// Child declaration can go here
答案 0 :(得分:1)
问题是 init 方法来自 Ancestor 类。并且在创建子实例后继承它。例如,下面的代码可以使用。
setTimeout(function() {
test()
}, 200);
function test() {
// Child declaration can go here
Child.prototype = new Ancestor(Child);
var child = new Child();
// If Child is placed here, this.init is undefined
function Child() {
this.init()
}
}
function Ancestor(constructor) {
this.constructor = constructor
}
Ancestor.prototype.init = function init() {
console.log(this)
}
所以,只需将 Child.prototype = new Ancestor(Child)移到 new Child 的调用之上。您不需要将Child构造函数放在 test 函数之外。
换句话说,在您的示例中,当您调用 new Child 时, init 方法仍未附加到 Child 原型。