Как определить, вызывается ли функция как конструктор? - PullRequest
101 голосов
/ 15 декабря 2008

С учетом функции:

function x(arg) { return 30; }

Вы можете назвать это двумя способами:

result = x(4);
result = new x(4);

Первое возвращает 30, второе возвращает объект.

Как определить способ вызова функции внутри самой функции ?

Каким бы ни было ваше решение, оно также должно работать со следующим вызовом:

var Z = new x(); 
Z.lolol = x; 
Z.lolol();

Все решения в настоящее время думают, что Z.lolol() вызывает его как конструктор.

Ответы [ 21 ]

0 голосов
/ 10 декабря 2009

Тим Даун, я думаю, это правильно. Я думаю, что как только вы дойдете до того момента, когда, по вашему мнению, вам нужно будет различать два режима вызова, вам не следует использовать ключевое слово "this". this ненадежен и может быть глобальным объектом или совершенно другим объектом. Дело в том, что нежелательно иметь функцию с этими различными способами активации, некоторые из которых работают так, как вы хотели, а другие делают что-то совершенно дикое. Я думаю, может быть, вы пытаетесь понять это из-за этого.

Существует идиоматический способ создания функции-конструктора, которая ведет себя одинаково независимо от того, как она вызывается. будь то Thing (), новый Thing () или foo.Thing (). Это выглядит так:

function Thing () {
   var that = Object.create(Thing.prototype);
   that.foo="bar";
   that.bar="baz";
   return that;
}

где Object.create - это новый стандартный метод ecmascript 5, который может быть реализован в обычном javascript следующим образом:

if(!Object.create) {
    Object.create = function(Function){
        // WebReflection Revision
       return function(Object){
           Function.prototype = Object;
           return new Function;
    }}(function(){});
}

Object.create примет объект в качестве параметра и вернет новый объект с тем, что передано в объекте в качестве его прототипа.

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

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