В принципе, вы можете сделать это:
(function() {
var global, lib, oldlib;
// We call this anonymous scoping function directly, so we know that
// within it, `this` is the JavaScript global object. Grab a
// local reference to it so we can use it within functions that get
// called via dotted notation and so have different `this` values.
global = this;
// Remember any value that already exists for the `lib` property
// of the global
oldlib = global.lib;
// Define our lib, assigning it to a local variable
lib = {
/* ...your stuff as usual, plus: */
noConflict: function() {
global.lib = oldlib;
return lib;
}
};
// Publish our lib externally on the global object
global.lib = lib;
})();
... который затем можно использовать так:
var alias = lib.noConflict();
Вот как это работает:
- Мы определяем функцию определения объема, а затем немедленно вызываем ее.
- В пределах функции видимости мы берем значение
this
как переменную с именем global
. Это будет глобальный объект JavaScript из-за способа вызова функции определения объема. (Глобальный объект в браузерах - window
, но нет необходимости ограничивать это браузерами, следовательно, получая global
таким образом).
- Первое, что мы делаем, это сохраняем любое старое значение, которое имело свойство
lib
глобального объекта, в локальной переменной в нашей функции определения масштаба, называемой oldlib
.
- Мы установили наше новое значение для
lib
.
- Наша функция
noConflict
восстанавливает предыдущее значение свойства lib
и возвращает нашу ссылку на lib, чтобы кто-то мог использовать ее в качестве псевдонима.
Кстати, когда вы используете функцию определения масштаба, вы также можете переключиться на использование именованных функций, а не анонимных, что имеет ряд преимуществ . Выше обновлено использование именованной функции для noConflict
.
(function() {
var global, lib, oldlib;
// We call this anonymous scoping function directly, so we know that
// within it, `this` is the JavaScript global object. Grab a
// local reference to it so we can use it within functions that get
// called via dotted notation and so have different `this` values.
global = this;
// Remember any value that already exists for the `lib` property
// of the global
oldlib = global.lib;
// Define the functions for our lib. Because they're defined
// within our scoping function, they're completely private
function lib_noConflict() {
global.lib = oldlib;
return lib;
}
// Define our lib, publishing the functions we want to be public
lib = {
/* ...your stuff as usual, plus: */
noConflict: lib_noConflict
};
// Publish our lib externally on the global object
global.lib = lib;
})();