2013-10-27 3 views
1

Это тривиально, чтобы добавить прототипы всех Function с:Локальная сфера Прототип функции переопределения

Function.prototype.foo = function() { return 'bar'; }; 
(new Function).foo(); // 'bar' 

Однако, это также плохая практика, чтобы назначить вещи прототип глобального объекта, в связи с кросс-модуля проблем объекта Reliance , что частично приводит к кончине предыдущих версий prototype.js.

Предположим, я хочу, чтобы все мои функции имели способ foo. Я хотел бы сделать что-то похожее на это:

(function() { 
    var Fn = Function; 
    Fn.prototype.foo = function() { return 'bar'; }; 

    (new Fn).foo(); // 'bar' 
}()); 

(new Function).foo() // also 'bar'. this is bad! 

К сожалению, это влияет на прототип Function «s, а также, потому что функция была областью действия путем ссылки.

Обычный подход «Копировать значение» для передачи примитивных значений в IIFE также потерпел бы неудачу, потому что сам Function является объектом.

(function (Fn) { 
    Fn.prototype.foo = function() { return 'bar'; }; 

    (new Fn).foo(); // 'bar' 
}(Function)); 


Function.foo // function() { return 'bar'; } 

Учитывая эти примеры, это правда, что невозможно расширить выбраны прототипы функций, не затрагивая все другие функции, находящиеся за пределами сферы?

+1

, связанные http://stackoverflow.com/questions/7988566/javascript-class-inherit-from-function-class –

+1

@ArtyomNeustroev «Ваш [ * sic *] пытается наследовать от функции. Это - правая боль. " Ну ... это позор. – Brian

ответ

0

Насколько я знаю, это невозможно. Вы могли бы попробовать что-то вроде этого, чтобы установить более опытные образцы сразу (скрипка: http://jsfiddle.net/ZgM8A/):

var ns = {}; 

(function(ns){ 
    var local = {}; 

    local.func1 = function() { 
     this.p = "func1"; 
    } 

    local.func2 = function() { 
     this.p = "func2"; 
    } 

    var proto = { 
     name : "test" 
    } 

    for (var prop in local){ 
     if (local.hasOwnProperty(prop) && typeof local[prop] === "function"){ 
      local[prop].prototype = proto 
     } 
    } 

    console.log(new local.func1()); 
    console.log(new local.func2()); 

}(ns)) 
0

Создание прототипа для пользовательских функций с помощью ключевого слова new.

Таким образом, первоначальный Function.prototype не изменится:

(function (BaseFunction) { 
    var CustomFunction = function() { }; 
    CustomFunction.prototype = new BaseFunction(); 
    CustomFunction.prototype.foo = function() { return 'bar'; }; 
    console.log((new CustomFunction()).foo()); // 'bar' 
})(Function); 
console.log((new Function).foo); //undefined 
+0

Что такое 'BaseFunction'? –

+0

@RocketHazmat опечатка, это ссылка на оригинальную 'Function'. –

+0

К сожалению, это не сработает. Объекты 'CustomFunction' не будут вызываться как функции. –

Смежные вопросы