如何“未定义不是函数”错误会变得更有用?

时间:2014-02-22 11:22:18

标签: javascript object methods prototype v8

考虑这个JavaScript代码:

var x = new date()

// "ReferenceError: date is not defined" - useful error, hints at a typo ('D'ate)

var x = new MyClass.foo()

// "TypeError: undefined is not a function" - bad error, no hint it might be 'F'oo

错误本身是正确的,因为MyClass没有foo方法,因此MyClass.foo确实返回undefined,而new没有'那样的。问题是这并没有暗示用户可能拼错了方法名称。现实生活中的例子:

new Meteor.collection('foo')  // instead of:
new Meteor.Collection('foo')  // c and C look alike with many fonts at small size

是否有可移植的方法来检测某个对象在 new传递给它undefined之前没有方法__noSuchMethod__正是我正在寻找的,但它看起来像是一个非标准的扩展。看起来像IE doesn't support itV8 refused to implement it。 Chromium团队也doesn't care much about implementing Proxy support

对于Node Proxythis以及this“a polyfill即将推出的ECMAScript Reflect API“,但请参阅下面的mpm评论。”

相关问题(这个归结为什么):

1 个答案:

答案 0 :(得分:3)

在这个问题之后一年多,V8可能更改了错误消息

var MyClass = function() {
  this.Foo = function() { console.log("Foo"); }
}

new MyClass().foo();

今天产生此错误

  

未捕获的TypeError :(中间值).foo不是函数

与命名对象一起使用

var mc = new MyClass();
mc.foo();

它更有用

  

未捕获的TypeError:mc.foo不是函数

与对象名称中的拼写错误一起使用也很有用:

new myClass().foo();
  

未捕获的ReferenceError:未定义myClass