Я использую следующие функции для создания экземпляров функций в JavaScript из массива аргументов:функции Instantiate 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;
}));
Используя описанную выше функцию можно создавать экземпляры следующим образом (см fiddle):
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?
Как бы вы использовали 'Object.create' удалить сложность из моего кода? Я был бы признателен, если бы вы могли написать демоверсию. –
Я добавил пример ссылки на мой ответ. Обратите внимание, что он не работает на версии носорога Ideone (но он отлично работает с моим, 1.7r3). –
Ваш метод работает для большинства конструкторов. Однако это вызывает [проблемы] (http://jsfiddle.net/MMp5u/2/), когда фабричная функция используется как конструктор (например, «Массив»). Использование 'Object.create (Array.prototype)' создает объект, который является 'instanceof' конструктором' Array'. Однако это не массив. Моя функция может показаться немного более сложной, однако она [избегает] (http://jsfiddle.net/MMp5u/1/) проблем, представленных вашей функцией. –