【问题标题】:Calling a function on an object from within that object with prototype从具有原型的对象内部调用对象上的函数
【发布时间】:2012-03-07 21:49:51
【问题描述】:

当我试图从同一个对象中调用一个对象上的函数时,我遇到了问题。我已经读过可以在该对象内调用该对象上的函数here,所以我认为一定是我使用prototype 导致了这个问题。这是一个例子:

function Foo() {
    this.DoStuff();
}

Foo.prototype.DoStuff = function() {
    alert("I'm frantically doing stuff!");
}

该代码(或非常相似的代码)只是不想工作。任何想法为什么?

【问题讨论】:

  • 刚刚测试了您的代码,它工作正常。请发布一个实际显示问题的示例:(

标签: javascript object prototype


【解决方案1】:

你所拥有的应该可以正常工作。请务必记住,this 的值取决于您调用函数的方式。要使其按预期工作,您需要使用 new 运算符将函数作为构造函数调用:

var foo = new Foo(); //`this` refers to this instance of Foo

这是working example

如果你正常调用函数,this 指的是全局对象,它没有DoStuff 属性,所以会抛出 TypeError。这是broken example

【讨论】:

  • 我确实正确地使用了new 关键字,这就是为什么我对我的代码不起作用的原因感到困惑。
  • @ElliotBonneville - 你能在jsfiddle.net 上举一个例子来说明你的问题吗?
  • 是的。我会在几分钟内回复你。
  • 其实我已经找到了问题所在。这完全是另一个问题——我想在我的对象上调用的函数涉及一些 DOM 操作,并且我在 DOM 完成加载之前创建了对象。一旦我将创建对象的行移动到一个地方,这样它只会在 DOM 初始化后被调用,我的问题就解决了。尽管您的回答在技术上没有为我提供解决方案,但我接受了它,因为它被证明是最有帮助的。谢谢! :)
【解决方案2】:

我猜你的原型语句是在你尝试使用 Foo() 之后声明的。

这应该可行:

Foo.prototype.DoStuff = function() { alert("stuff") };
myfoo = new Foo();

这不应该:

myfoo = new Foo();
Foo.prototype.DoStuff = function() { alert("stuff"); };

【讨论】:

  • 不,事实并非如此。我的代码结构非常整齐(如果我自己这么说的话),并且在创建对象和原型语句之前我没有声明任何对象或变量。不过,感谢您的帮助!
  • 如果我不得不再做一次猜测,我会质疑你是如何称呼 Foo 的(James Allardice 在上面提到了这一点)。如果是这种情况并且您不能以任何其他方式调用它,您可能需要检查 bind。
  • 其实我已经解决了这个问题。 :) 请参阅我对 James Allardice 回答的评论。只是出于好奇,“签入绑定”是什么意思?
  • 很高兴听到! Javascript 中的绑定允许您将“this”关键字绑定到特定对象。无论函数如何调用,“this”始终是您绑定到的对象。这是来自 MDN 的链接 - developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
  • 啊,好吧,这很有道理。谢谢!
【解决方案3】:

这取决于您如何称呼Foo()。如果您直接调用它,那么 this 指的是 this 在该上下文中的任何内容。如果您使用new 运算符调用它,那么this 将成为该对象的实例,然后它可以访问DoStuff()

var foo = new Foo(); // works!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    相关资源
    最近更新 更多