2015-04-26 3 views
-1

Я хочу создать js-библиотеку (для помощи в тестах). Я хочу, чтобы эта библиотека добавила один новый метод X в массив или объект. но некоторые люди могут не хотеть этого поведения и вместо этого предпочли бы иметь возможность выбрать имя (Y вместо X) или даже иметь новый метод вообще, но использовать его как X(array).x().дизайн библиотеки js и загрязнение пространства имен

некоторые люди используют requireJs, но кто-то этого не делает. так, каковы наилучшие методы предоставления таких новых функций? как это сделать, чтобы избежать столкновения имен и сделать библиотеку простой в использовании?

Есть ли способ обеспечить новую функциональность без загрязнения пространства имен, чтобы позволить пользователю назначить его любой переменной, которую он хочет?

Разъяснение:

скажем я хочу добавить метод в массив, который печатает «привет мир». Я могу предоставить глобальную переменную HelloWorldLibrary, а затем пользователь может привязать ее к любому методу, который он хочет. но это уже вводит одно имя в глобальное пространство имен. есть ли способ избежать этого или это правильный путь, и я должен делать это таким образом?

+0

Я не понимаю ... вы имеете в виду переопределение имени, но с той же функциональностью? – Typo

+0

№. Я хочу предоставить совершенно новые функции с новым именем. но я чувствую, что выбор имени произвольно не может быть лучшим решением. так есть ли способ позволить пользователю настроить имя? – piotrek

+1

сделать его самим объектом, и пусть он назовет его так, как он хочет – Typo

ответ

0

Нет, нет способа в настоящее время bind a method to an object in a scoped way, оправдание в том, что оно может быть выполнено с помощью внешних методов, используя пользовательские объекты (а не напрямую прикрепляя их к массиву или объекту) и что это дорого стоит во время выполнения.

Прецедент очень реально, хотя (добавление свойства для каждого объекта), было абстрактные ссылки предложения, что сделал именно это - это теперь заменено function bind предложение, предлагаемый синтаксис ES7 выглядит примерно так:

function myNewMethod(x){ 
    alert(this.y + x); 
} 

var obj = {y: 5}; 
obj::myNewMethod(5); // logs 10 

Что касается фактического управления модулем - вы можете использовать модули ES6 с API-интерфейсом загрузчика модуля. Модули ES6 (ключевые слова import и export) позволяют импортировать/экспортировать материал без загрязнения глобального пространства имен. Решения для систем до ES6 существуют с использованием загрузчиков модулей, таких как RequireJS, и таких инструментов, как браузер.