在JavaScript中扩展数学对象
因为直接扩展内置对象的做法不好,所以我考虑创建一个本地对象来扩展全局对象,例如使用在JavaScript中扩展数学对象,javascript,extend,Javascript,Extend,因为直接扩展内置对象的做法不好,所以我考虑创建一个本地对象来扩展全局对象,例如使用$.extend(obj,Math)Math是一个对象,但是您似乎无法访问它的任何属性,例如: for (obj in Math) { console.log(obj); } 为什么?因为它们都被定义为不可枚举的。规范定义对象的几乎所有内置属性都是不可枚举的。枚举对象中的属性时,不可枚举属性不会显示(通过for in或object.keys) 不过,你有两个想法: 您可以使用Math作为原型创建对象,如下所
$.extend(obj,Math)
Math
是一个对象,但是您似乎无法访问它的任何属性,例如:
for (obj in Math) {
console.log(obj);
}
为什么?因为它们都被定义为不可枚举的。规范定义对象的几乎所有内置属性都是不可枚举的。枚举对象中的属性时,不可枚举属性不会显示(通过
for in
或object.keys
)
不过,你有两个想法:
Math
作为原型创建对象,如下所示:
for (obj in Math) {
console.log(obj);
}
//使用Math作为原型创建MyMath对象
var MyMath=Object.create(数学);
//检查MyMath是否有数学函数
显示(MyMath.floor(2.3));
//效用函数
功能显示(msg){
document.body.insertAdjacentHTML(“beforeed”和“”+msg+””;
}
除了填隙/填充外,扩展内置对象的原型通常被视为不好的做法。但是向非原型(比如数学)添加函数是非常无害的。@T.J.Crowder为什么?如果其他人也添加了相同名称的内容呢?还是因为它太少了?为什么添加原型通常被视为不好的做法?是的,这是冲突——既与其他人添加的内容冲突,也与规范的更新冲突。例如:几年前,PrototypeJS使用=
比较将indexOf
添加到数组实例中。然后将indexOf
添加到规范中,但使用=
比较。因此,使用PrototypeJS并依赖旧定义的代码将因新定义而失败。它也有一个坏名声,因为在ES5之前,你不能向原型添加不可枚举的属性,所以像这样的添加出现在人们意想不到的地方。就我个人而言,除了应用程序代码中的Object.prototype
,我对添加原型没有问题。你只是在承担责任,确保一旦发生冲突,你能处理好它。在我看来,在库中这样做是一个坏主意。它没有在实例上显示属性的问题,它包含的内容更多。当然,冲突问题仍然存在。