【问题标题】:Prototype function declaration原型函数声明
【发布时间】:2011-08-07 20:23:06
【问题描述】:

我已经定义了函数:

var Test = function(){

};

Test.prototype={

   getColor: function(){
         return "red";
   },

   createCar: function(){
      var color = this.getColor(); //ERROR: this.getColor is not a function
      ...
   },

   getCar: function(){
      return new CarFactory(1, this.createCar);
   }

}

如您所见,我定义了 三个 prototype 函数: getColor() 、 createCar() 和getCar().

在 createCar() 函数中我调用了 getColor(),

在getCar()函数中,我使用this.createCar作为CarFactory构造函数的参数。我得到了错误:

"this.getColor 不是函数"

在上面指出的地方,为什么会出现这个错误?如何摆脱这个错误?

【问题讨论】:

标签: javascript prototype javascript-framework


【解决方案1】:

我认为您可能没有创建 Test 对象并正确调用它。我将您的 sn-p 粘贴到测试页面中,然后添加:

var obj = new Test();
console.log(obj.getColor());
// Outputs 'red'
obj.createCar();
// Does not throw an error. 

将您的... 替换为console.log(color); 在我的测试中显示正确的结果为“红色”。

http://jsfiddle.net/2F5zz

【讨论】:

  • 嗨,我更新了我的帖子。我没有准确描述我的问题。
【解决方案2】:

如果您正确实例化Test。像这样:

var test = new Test();
test.createCar(); 

您不会收到此错误。在我看来,您正试图以这种方式致电createCar:

Test.createCar();

定义原型时,您定义的成员将被复制到该类型/函数的任何实例。在您的情况下,您正在定义每个 Test 实例都将具有 2 个函数,getColor 和 createCar。因此,这些功能不在测试范围内。它们在测试实例的范围内。您使用 new 键创建实例

【讨论】:

  • 嗨,我更新了我的帖子。我没有准确描述我的问题。
【解决方案3】:

因为使用 this.createCar 作为回调,您只传递了没有上下文的函数。

尝试如下更改您的代码:

   getCar: function(){
      var that = this;
      return new CarFactory(1, function() {
            return that.createCar();
      });
   }

或者只是将 Test 实例传递给 CarFactory 并将 createCar 的调用委托给它:P

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2021-03-17
    • 1970-01-01
    • 2011-12-16
    • 2016-05-23
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多