JavaScript:如何从原型(prototype)属性上的另一个函数调用原型(prototype)属性上的函数,所有这些都在闭包内?

标签 javascript scope closures prototype

我希望有人能帮助我弄清楚如何正确地做到这一点,而不仅仅是“让它发挥作用”。

我尝试在闭包内使用对象,但遇到范围问题:

var Why = function() {
    this.foo = 'bar';
}
Why.prototype.explain = function () {
    alert(this.foo);
}
Why.prototype.doIt = function () {
    this.explain();
}

(function() {

    document.addEventListener("DOMContentLoaded", function(event) {
        var why = new Why();
        why.doIt();
    });

})();

我进入控制台:

Uncaught TypeError: this.explain is not a function

我可以使用

Why.prototype.explain.call();

但这似乎是错误的,当我实际这样做时...... this.foo 无论如何都是未定义的,所以这显然不是正确的方法。

如果我按如下方式删除自调用函数...

var Why = function() {
    this.foo = 'bar';
}
Why.prototype.explain = function () {
    console.log(this.foo);
}
Why.prototype.doIt = function () {
    // Why.prototype.explain.call();
    this.explain();
}

// (function() {

    document.addEventListener("DOMContentLoaded", function(event) {
        var why = new Why();
        why.doIt();
    });

// })();

那么它当然可以工作,但是:

我缺少什么以及在哪里/如何学习它?

提前致谢。

最佳答案

您的代码被解析为

Why.prototype.doIt = function () { ... }(function() { ... });

您正在调用要分配给原型(prototype)的函数,然后分配其返回值。由于它返回 undefined,因此 Why.prototype.doIt 不存在。

您需要一个分号。

关于JavaScript:如何从原型(prototype)属性上的另一个函数调用原型(prototype)属性上的函数,所有这些都在闭包内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31060734/

相关文章:

javascript - 在不同的 url 之间进行无缝转换

javascript - 有没有办法确定 JavaScript 函数是否有副作用?

javascript - moment.js 上的无效日期错误

javascript - jQuery 选择器与每个选择器

scope - Vue 组件未在路由器 View 中呈现

javascript - 在闭包中保留变量内容时遇到问题

actionscript-3 - ActionScript 3.0 为事件处理程序使用闭包

javascript - 如何将 Proxy 对象作为上下文传递给 JavaScript 中的闭包

javascript - React JS : how to properly remove an item from this. state.data 其中数据是一个对象数组

Javascript 作用域