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

Javascript 直接访问原型的值,即Object.prototype.toString.call(),javascript,prototype,Javascript,Prototype,是否有理由直接从原型而不是通过继承引用方法?这些似乎是事实上的标准: var argsArr = Array.prototype.slice.call(arguments); 及 字面意思对我来说更好?它比较短,阅读起来也不那么混乱 var argsArr = [].slice.call(arguments); 及 如果有一个性能增益,它必须可以忽略不计,并且函数很容易缓存。创建一个新对象可能会有很小的开销,但同样可以忽略不计?当然,你的方法会很好地工作。它确实会不必要地创建和丢弃对象,但正

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

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

字面意思对我来说更好?它比较短,阅读起来也不那么混乱

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


如果有一个性能增益,它必须可以忽略不计,并且函数很容易缓存。创建一个新对象可能会有很小的开销,但同样可以忽略不计?

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

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

参与过早的微观优化模式

对于
slice
用例,在Chrome上使用文字在我的机器上大约慢4%,在Firefox上慢9%,在IE10上没有任何区别。很可能在那之后你所做的任何事情都会掩盖这种效果。当然,记忆流失的影响更难衡量

如果您经常这样做,我会绕过整个问题,创建一个
Utils
对象(或者将这些对象添加到
数组
):


但是
Array.prototype.slice==[].slice
我看不出当调用
arguments
时如何重写它以得到不同的结果。您已经解释了在
arguments
上调用Array
slice
的原因,而OP询问是否有一种调用
slice
的方法(
Array.prototype.slice
)优于另一个(
[].slice
)。可能的重复不是具体的性能问题。前一个代码如此流行肯定是有原因的。对我来说,它更短,但更令人困惑。此外,显式的
.prototype
访问确实是一个很好的选择。
var argsArr = [].slice.call(arguments);
var isArr = {}.toString.call(object) === '[object 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
    };
})();