Клонирование функции JavaScript: что-нибудь еще лучше, чем использование eval? - PullRequest
0 голосов
/ 26 мая 2011

РЕДАКТИРОВАНИЕ

Примечание: я полностью отредактировал это, потому что предыдущая проблема была решена с использованием другого подхода, и я упростил этот вопрос, чтобы ответить самому себе своим решениемна вопрос и поделюсь с вами моим выводом.

Как клонировать функцию, избегая использования eval(...)?

Мне нужно получить точную копию какой-то данной функциии это должен быть объект, отличный от исходного.

Это functionA != functionCloneOfA, и перенос "functionA" и вызов его из тела какого-то другого не является решением для меня.

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Рассматривали ли вы функцию «клона» Лассе Рейхштейна Нильсена? По сути, он «клонирует» функцию, возвращая новый объект, который имеет функцию в своей цепочке прототипов. Дуглас Крокфорд называет свою версию «порождать» .

var cloneFn = (function() {
    var F = function(){};
    return function(fn) {
        F.prototype = fn;
        return new F();
    }
}());

var myClone = cloneFn(someFn);

Возвращает объект, чья [[prototype]] является «клонированной» функцией someFn.

1 голос
/ 26 мая 2011

Я думаю, что получил то, что тебе нужно сейчас.Вам просто нужно вызвать конструктор A для B-объекта, например:

function A() { this._someVal = 'test'; }
function B() { this._someOtherVal = 'test2'; }
B.prototype = new A(); // this is how inheritance is normally done in Javascript.
B.prototype.getVal = function() { return this._someVal; }

var b = new B();
alert(b.getVal());
alert(b._someVal);
alert(b._someOtherVal);

Если вы не хотите делать это таким образом, вы можете вызвать A-конструктор изнутри Bнапример:

function B() { A.call(this, []); this._someOtherVal = 'test2'; }

, но вам нужно вручную скопировать все функции-прототипы из A в B.

0 голосов
/ 30 мая 2011

Наконец, мне не нужно было клонировать функции для решения какой-то проблемы в одном из моих проектов, но я хочу поделиться с вами тем, что нашел, чтобы действительно клонировать функцию:

function cloneFunc(someFunc) {
    var someFuncAsText = someFunc.toString();

    return new Function
    (
        /\(([\s\S]*?)\)/.exec(someFunc)[1],
        someFuncAsText.substring(someFuncAsText.indexOf("{") + 1, someFuncAsText.lastIndexOf("}"))
    );
}

Я не совсем уверен, что это лучший подход, но он создает анонимную функцию, которая является точным клоном исходной функции, но оба являются разными объектами.

Возможно, использует какой-то "eval", потому что я строю функцию с помощью этого конструктора объекта Function, но я считаю, что это более элегантно, чем фактическое использование eval (...) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...