Расширение объекта Math в JavaScript

Так как это плохая практика прямого расширения встроенных объектов, я думал о создании локального объекта, который расширяет глобальный объект, например, с помощью $.extend(obj, Math), Math является объектом, однако вы не можете получить доступ к какому-либо из его свойств:

for (obj in Math) {
   console.log(obj);
}

Зачем?

1 ответ

Решение

Потому что они все определены как не перечисляемые. Почти все встроенные свойства объектов, определенных спецификацией, не перечисляются. Не перечисляемые свойства не отображаются при перечислении свойств объекта (через for-in или же Object.keys).

Две идеи для вас:

  1. Вы можете создать свой объект с 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>");
     }
     

  2. 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.

Другие вопросы по тегам