Я бы предложил написать свою собственную библиотеку расширения прототипов собственных объектов, которая намного проще и быстрее, чем можно было бы предположить в первой фразе этого предложения. Prototype.js делает нечто похожее, как и в проприетарной библиотеке, которую я использую в различных системах, которые я поддерживаю. Одним из преимуществ этого маршрута является межбиблиотечная совместимость, другое - сокращение накладных расходов на создание новых собственных объектов, когда ваши методы расширения не нужны. Некоторые библиотеки, подобные этой, используют один объект для методов расширения, я предпочитаю иметь объекты, относящиеся к определенным нативным объектам.
(function(){
//native object specific factory objects for expansion
var Arrays = function(o) { this.value = o; },
, Objects = function(o) { this.value = o; },
, Strings = function(o) { this.value = o; },
, Functions = function(o) { this.value = o; },
, Dates = function(o) { this.value = o; },
, Numbers = function(o) { this.value = o; };
, Booleans = function(o) { this.value = o; };
//route object to correct expansion pack
var Shell = function(o) {
var type = Object.prototype.toString.call(o);
switch( type ) {
case '[object Array]' : return new Arrays(o);
case '[object Boolean]' : return new Booleans(o);
case '[object Date]' : return new Dates(o);
case '[object Function]': return new Functions(o);
case '[object Number]' : return new Numbers(o);
case '[object Object]' : return new Objects(o);
case '[object String]' : return new Strings(o);
default : throw { name : "Unsupported Object", message: "Unsupported Object type: "+type};
}
}
//easy access for prototyping
Shell.Array = Arrays.prototype;
Shell.Boolean = Booleans.prototype;
Shell.String = Strings.prototype;
Shell.Function = Functions.prototype;
Shell.Date = Dates.prototype;
Shell.Number = Numbers.prototype;
Shell.Object = Objects.prototype;
//global access
this._nativeWrapper = Shell;
})(window);
Несколько вещей, которые вы хотели бы добавить к этому, - это, вероятно, методы цепочки и применения расширения прототипа ко всем объектам фабрики одновременно. Вы также захотите убедиться, что если вы напишите расширитель для копирования свойств в прототип Shell или любой из объектов фабрики, то вы будете делать это таким образом, чтобы учитывать методы получения и установки.