Создание экземпляров функций JavaScript с пользовательскими прототипами

Я использую следующую функцию для создания экземпляров функций в 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?

6
задан Aadit M Shah 15 July 2012 в 08:45
поделиться