问题描述
是否有最佳实践来为模块化JavaScript的全局范围的类(如Array,Number等)编写原型?
例如,我有一个 create-react-app 应用程序,我想找到一种将原型添加到全局范围的好方法。
arrayHelpers.js
Array.prototype.unique = () => {
//... some code
};
SomeComponent.js
export default const SomeComponent = () => {
const someArray = ["foo","bar","foo"];
const someArrayThatHasOnlyUniqueItems = someArray.unique(); // ["foo",bar"]
// ... more code
};
我不想使用像 unique(array)这样的经典函数,因为原型更加简洁易用。
解决方法
扩展本机原型非常令人讨厌。 This is how you break the internet!
您可以通过扩展现有的数组类型来创建自定义数组类型(在这种情况下,您将必须在创建一个的每个文件中导入自定义数组):
class MyArray extends Array {
function unique() {
//...
}
}
const someArray = new MyArray("foo","bar")
您可以扩展Array的Symbols原型(在这种情况下,您必须将Symbol导入到使用该功能所需的每个文件中):
const unique = new Symbol('unique')
Array.prototype[unique] = () => { ... }
// ...
someArray[unique]()
但是可能最好的方法是简单地使其成为一个独立的函数:
function unique(array) {
// ...
}
unique(someArray)
是的,就像大多数好的代码一样,它很无聊。
是的,它不那么含糖(但是,如果您喜欢糖,则可以随时编写自己的Babel插件)。
是的,您必须将其导入到任何地方(大多数JS项目在每个文件上都有很多导入)。
是的,这是这样做的方式。