Я использую следующую функцию для создания экземпляров функций в JavaScript из массива аргументов:
var instantiate = function (instantiate) {
return function (constructor, args, prototype) {
"use strict";
if (prototype) {
var proto = constructor.prototype;
constructor.prototype = prototype;
}
var instance = instantiate(constructor, args);
if (proto) constructor.prototype = proto;
return instance;
};
}(Function.prototype.apply.bind(function () {
var args = Array.prototype.slice.call(arguments);
var constructor = Function.prototype.bind.apply(this, [null].concat(args));
return new constructor;
}));
Используя приведенную выше функцию, вы можете создавать экземпляры следующим образом (см. скрипку ):
var f = instantiate(F, [], G.prototype);
alert(f instanceof F); // false
alert(f instanceof G); // true
f.alert(); // F
function F() {
this.alert = function () {
alert("F");
};
}
function G() {
this.alert = function () {
alert("G");
};
}
Приведенный выше код работает для пользовательских конструкторов, таких как F
. Однако это не работает для нативных конструкторов, таких как Array
, по очевидным причинам безопасности. Вы всегда можете создать массив, а затем изменить его свойство __proto__
, но я использую этот код в Rhino, поэтому он там не работает. Есть ли другой способ добиться того же результата в JavaScript?