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

Value of directly accessing prototype i.e. Object.prototype.toString.call()

本文关键字:prototype Object toString call 访问 原型      更新时间:2023-09-26

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

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]';

如果有性能提升,它必须可以忽略不计,并且函数很容易缓存。也许创建新对象时开销很小,但这又可以忽略不计?

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

我认为这主要只是为了避免不必要的创作,不必要的记忆流失。引擎过去比现在慢得多。

采用过早微优化模式...

看起来对于slice用例,在 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
    };
})();