Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能定义一个“a”吗;“撤退”;JavaScript中的方法?_Javascript - Fatal编程技术网

我能定义一个“a”吗;“撤退”;JavaScript中的方法?

我能定义一个“a”吗;“撤退”;JavaScript中的方法?,javascript,Javascript,在JavaScript中定义“回退”方法是否可能(以性能的方式) 比如说 function MyObject () { /* what do i have to add here to have my defaultMethod? */ } var obj = new MyObject (); obj.doesntExistInMyObject (); // I want defaultMethod to be called obj.doesntExistEither (); // I

在JavaScript中定义“回退”方法是否可能(以性能的方式)

比如说

function MyObject () {
   /* what do i have to add here to have my defaultMethod? */
}

var obj = new MyObject ();
obj.doesntExistInMyObject (); // I want defaultMethod to be called
obj.doesntExistEither (); // I want defaultMethod to be called, too

即:每当我编写
obj.calledMethod()时,我希望调用
defaultMethod
obj.calledMethod==undefined
,但我不想检查调用代码中的
undefined

JavaScript当前没有该功能。不过,在下一个版本中,它可能会通过。所以在那之前,你必须做一些相当丑陋的事情,比如:

MyObject.prototype.ex = function(fname) {
    var f    = this[fname],
        args = Array.prototype.slice.call(arguments, 1);
    if (typeof f === "function") {
        return f.apply(this, args);
    }
    return this.defaultMethod.apply(this, args);
};
…并像这样使用它:

var obj = new MyObject();
obj.ex("doesntExistInMyObject", "arg", "arg");

ex
表示“执行”,因为
call
太容易与之混淆。)

谢谢您的回答。这不是很方便,但我可能不得不尝试这样的解决方案。有人知道JavaScript中异常是否代价高昂吗?@JohnB:这个问题有两个方面:一个
try
块的代价,以及实际抛出异常的代价。带有异常概念的现代语言环境试图使
try
块非常非常便宜。(例如,Java VM的早期版本有相当昂贵的
try
块,但它被确定为一个主要问题,并且很快得到了修复。)这是因为
try
块是/应该是正常代码流的一部分。另一方面,例外恰恰是:例外。它们不应在正常程序流中使用。(并不是每个人都同意。)(续)@JohnB:(继续)抛出异常往往代价高昂。成本的变化和上下文相关,但更重要的是,由于这是JavaScript,它是引擎敏感的。所以除了在你的目标引擎上进行测量外,没有别的办法。我把和的测试放在一起。看起来
try
块的成本非常小,在jsPerf的误差范围内;实际上,现代发动机的成本应该是零。(续)@JohnB:但正如你所看到的,抛出异常与(比如)守卫检查的成本非常大。Chrome可以调用一个执行2700万次保护检查的函数,而调用一个仅抛出47K次的函数所需的时间!正如你所看到的,其他引擎似乎是相似的,甚至可以追溯到IE7中旧的慢速引擎。所以:
try
实际上是免费的;实际上扔东西很贵。谢谢你的详细解释。很明显,我将不得不做一些不太优雅的事情。