Как я могу автоматизировать создание переменных из глобального объекта? - PullRequest
1 голос
/ 28 марта 2012

Я хочу сделать функцию, которая автоматически превращает каждую "математическую" функцию в глобальную

пример:

floor = Math.floor

Это позволяет мне сделать это:

alert(floor(2.5))

Приведенный выше пример отлично работает (он предупреждает «2»), но я не могу найти способ автоматизировать этот процесс для каждой функции в объекте «Math».Я посмотрел в интернете и попытался что-то сделать сам, но ... ничего не получается.

ответ:

(function(a,b){for(b in a=Object.getOwnPropertyNames(Math))this[a[b]]=Math[a[b]]})()

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

На самом деле вы можете подумать, что можете просто зациклить все свойства объекта Math и превратить любую функцию в глобальную (скопировав ее ссылку):

for( var prop in Math ) {
    if( typeof Math[ prop ] === 'function' ) {
        window[ prop ] = Math[ prop ];
    }
}

Это будет работать .. , если слово будет не будет здесь:)

Мы можем обнаружить проблему с Object.getOwnPropertyDescriptor:

console.log( Object.getOwnPropertyDescriptor(Math, 'floor') );

.. и, как мы видим, все methods установлены на enmuerable false.


редактировать

Я действительно забыл о Object.getOwnPropertyNames. Вы действительно можете получить все имена свойств с помощью этого метода, например

Object.getOwnPropertyNames(Math).forEach(function(name) {
    if( typeof Math[name] === 'function' )
        window[name] = Math[name];
});
3 голосов
/ 28 марта 2012

Примерно так:

Object.getOwnPropertyNames(Math).forEach(function (p) {
    window[p] = Math[p];
});

alert(floor(4.5));
alert(sqrt(100));

getOwnPropertyNames дает все свойства объекта, а не только перечисляемые.

Это работает в браузере, где глобальный объект называется window.Для других сред JS вам может понадобиться что-то другое.

Скрипка

...