我已经看到数组的三种方法都是静态的,方法是静态的。 Array.isArray()
,Array.from()
,Array.of
。我能理解为什么它们是静态方法。因为传递给他们的变量也可以是数组以外的东西。 Number
和String
也是如此。
但是我不明白为什么Object
的几乎所有方法都是静态的。为什么keys
,entries
,values
等不在prototype
上。
Object.prototype.keys/entries/values...
会遇到什么问题答案 0 :(得分:2)
对象方法存在于原型中的问题是对象通常可以具有任意键-值对。例如,如果存在诸如Object.prototype.values
之类的东西,那么当您有一个打算具有values
属性的对象时,很容易引起混乱,例如
const foo = { values: ['val1', 'val2'] };
如果Object.prototype.values
是一件东西,要在这里使用它,您必须做类似的事情
const fooValues = Object.prototype.values.call(foo);
最好将values
设为静态方法,以避免这种名称冲突。
如果对象的属性也可以是函数,则可能更糟,例如:
const foo = {
info: ['a', 'b', 'c'],
values() {
return this.info;
}
};
现在,如果Object.prototype.values
是一个问题,并且您在代码中看到了foo.values()
,您认为这意味着什么?程序员是否打算调用values
的{{1}}属性(这就是代码的结果),还是程序员打算使用foo
?这将是错误和难以阅读的代码的简单来源。
与其他Object静态方法相同-它们很容易导致名称冲突。