Вызов метода фабрики Javascript - PullRequest
4 голосов
/ 03 января 2012

Я изучаю объектно-ориентированный Java-скрипт. У меня есть ниже код для фабричного метода.

function Foo() {
    var value = 1;
    return {
        method: function() {
            return value;
        },
        value:value
    }
}
Foo.prototype = {
    bar: function() {}
};

new Foo();
Foo();

метод Foo можно вызвать двумя способами. new Foo(); или Foo(); Оба делают одно и то же и вывод одинаков. Какова реальная разница в обработке сценариев Java?

Ответы [ 4 ]

3 голосов
/ 03 января 2012

В обычных случаях new следует использовать при создании объектов из функции конструктора и избегать при выполнении любого другого вызова функции.При использовании new в функции 1) создается новый объект;2) функция вызывается со значением this, связанным с этим новым объектом, и 3) значением, возвращаемым функцией (по умолчанию), является объект, созданный на первом этапе.

Однако в вашем случае вы возвращаете совершенно новый объект из «конструктора» (отличного от объекта в 1) выше), что означает, что практических различий нет.Значение this будет по-прежнему отличаться внутри функции, но оба они вернут false:

new Foo() instanceof Foo;
Foo() instanceof Foo;

Чтобы проиллюстрировать разницу this, добавьте следующее к Foo:

alert(this instanceof Foo)

При вызове с new это оповещения true;при вызове без него false.

Более того, нет смысла присваивать объект Foo.prototype, потому что вы никогда не создадите экземпляров Foo, которые бы его использовали (потому что, опять же,, вы возвращаете что-то совершенно отличное от Foo).

Если вы собираетесь вернуть пользовательский объект из Foo, тогда вы должны предпочесть версию без new;нет смысла создавать новый экземпляр Foo, если вы собираетесь его игнорировать и возвращать что-то совершенно другое.

2 голосов
/ 03 января 2012

Вот отличная ссылка:

Является ли Javascript "новым" вредным?

Смотри также:

http://phabricator.com/docs/phabricator/article/Javascript_Pitfalls.html

Но вот лучшая ссылка (и, действительно, ответ на ваш вопрос:

http://www.crockford.com/javascript/inheritance.html

JavaScript - это бесклассовый объектно-ориентированный язык, и поэтому он использует наследование прототипа вместо классического наследования. Это может озадачивать программистов, обученных обычным объектно-ориентированным такие языки, как C ++ и Java ...

1 голос
/ 03 января 2012

Ключевое слово javascript в функциях довольно странное. Лучшее (только?) Подробное объяснение того, что происходит, я смог найти на самом деле этот ТАК ответ от Дэниела Ховарда.

Требуется чтение для тех, кто пытается изучить некоторые из более продвинутых концепций Javavscript.

Кстати, вы можете получить действительно далеко в js, вообще не используя новое ключевое слово. Обратите внимание, что в основном ни один код, использующий jquery, не опирается на него.

0 голосов
/ 03 января 2012

Поскольку вы возвращаете объект из Foo, использование new не имеет никакого эффекта.Возвращаемые значения Foo() и new Foo() будут , а не будут экземплярами Foo;вместо этого они будут экземплярами типа любого значения, которое вы вернули.

Такое же поведение наблюдается, если вы возвращаете какой-либо † объект или любую функцию из вашего конструктора. Однако , если Foo должен был вернуться:

  • Строка
  • Число
  • null
  • undefined (то же самое, что вообще ничего не возвращать)
  • или this

... тогда возвращаемое значение new Foo() будет экземпляр Foo.

Вы можете проверить приведенный ниже код на JSFiddle :

function ReturnsString() { return "string"; }
function ReturnsNumber() { return 1; }
function ReturnsNull() { return null; }
function ReturnsUndefined() { return void 0; }
function ReturnsThis() { return this; }
function ReturnsFunction() { return function() {}; }
function ReturnsObject() { return {}; }

alert("Results:"
    + "\nReturnsString: " + (new ReturnsString() instanceof ReturnsString)
    + "\nReturnsNumber: " + (new ReturnsNumber() instanceof ReturnsNumber)
    + "\nReturnsNull: " + (new ReturnsNull() instanceof ReturnsNull)
    + "\nReturnsUndefined: " + (new ReturnsUndefined() instanceof ReturnsUndefined)
    + "\nReturnsThis: " + (new ReturnsThis() instanceof ReturnsThis)
    + "\nReturnsFunction: " + (new ReturnsFunction() instanceof ReturnsFunction)
    + "\nReturnsObject: " + (new ReturnsObject() instanceof ReturnsObject)
);

Оба конструктора ReturnsFunction и ReturnsObject покажутfalse результат, означающий, что они сами не возвращают instanceof при использовании с оператором new.

Все остальные конструкторы do сами возвращают instanceof, когдаиспользуется с оператором new.

† За исключением this, как я уже упоминал выше

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