直接访问原型的价值,即Object.prototype.toString.call()

时间:2013-09-12 09:53:17

标签: javascript prototype

是否有理由直接从原型而不是通过继承引用方法?这些似乎是事实上的标准:

var argsArr = Array.prototype.slice.call(arguments);

var isArr = Object.prototype.toString.call(object) === '[object Array]';

文字对我来说似乎更好?它更短,更难以阅读。

var argsArr = [].slice.call(arguments);

var isArr = {}.toString.call(object) === '[object Array]';

如果性能提升,则必须可以忽略不计,并且功能很容易缓存。也许创建一个新对象的开销微乎其微,但这又可以忽略不计?

1 个答案:

答案 0 :(得分:1)

当然,你的方式会很好地运作。它确实会不必要地创建和丢弃对象,但正如你所说,这样做的开销将是非常微不足道的。 FWIW,可读性是主观的(我发现使用原型的版本更容易阅读。)

我认为这主要是为了避免不必要的创造,不必要的记忆流失。发动机过去比现在慢得多。

参与过早的微优化模式......

对于slice用例的

Looks like,使用文字的Chrome浏览器在我的机器上慢了大约4%,在Firefox上它的价格下降了9%,在IE10上没有任何差别。很可能无论你在做什么之后都会淹没这种效果。当然,记忆流失的影响难以衡量。

如果你这么做很多,我会绕过整个问题并拥有一个Utils对象(或将这些对象添加到Array):

var Utils = (function() {
    var arraySlice = Array.prototype.slice;      // Or [].slice
    var objToString = Object.prototype.toString; // Or {}.toString

    function cloneArray(a) {
        return arraySlice.call(a);
    }

    function isArray(a) {
        return objToString.call(a) === '[object Array]';
    }

    return {
        cloneArray: cloneArray,
        isArray:    isArray
    };
})();