Расширение объекта Math в JavaScript
Так как это плохая практика прямого расширения встроенных объектов, я думал о создании локального объекта, который расширяет глобальный объект, например, с помощью $.extend(obj, Math)
, Math
является объектом, однако вы не можете получить доступ к какому-либо из его свойств:
for (obj in Math) {
console.log(obj);
}
Зачем?
1 ответ
Потому что они все определены как не перечисляемые. Почти все встроенные свойства объектов, определенных спецификацией, не перечисляются. Не перечисляемые свойства не отображаются при перечислении свойств объекта (через for-in
или же Object.keys
).
Две идеи для вас:
Вы можете создать свой объект с
Math
как его прототип, вот так:// Create the MyMath object with Math as its prototype var MyMath = Object.create(Math); // Check that MyMath has a Math function on it display(MyMath.floor(2.3)); // Utility function function display(msg) { document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>"); }
ES5 представила новую функцию,
Object.getOwnPropertyNames
, который может получить имена всех свойств (как перечисляемых, так и не перечисляемых) от объекта. (А так как прототипMath
являетсяObject.prototype
вы, вероятно, просто хотите иметь "собственные" свойства.) Таким образом, вы можете сделать это на ES5-совместимом движке:// Create the MyMath object with all of the own properties on Math var MyMath = {}; Object.getOwnPropertyNames(Math).forEach(function(name) { MyMath[name] = Math[name]; }); // Check that MyMath has a Math function on it display(MyMath.floor(2.3)); // Utility function function display(msg) { document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>"); }
Вариант 1, вероятно, ваш лучший вариант, не в последнюю очередь потому, что версия с одним аргументом Object.create
может быть заполнен / заполнен на двигателях до ES5.