В другом Вопрос опасно для использования, и предложил решение для создания объекта, в котором не использовался new Я не верил, что это правда, в основном потому, что я использовал P rototype, Scriptaculous и другие прекрасные библиотеки JavaScript, и все они уже использовали ключевое слово new в своем коде (new ключевое слово.

Несмотря на это, вчера я смотрел выступление Дугласа Крокфорда в театре YUI, и он сказал то же самое, что он не использовал new Крокфорд о JavaScript — Акт III: Функция предельного — 50:23 минут 22 октября 12 в 11:07 ).

Это не работает, потому что Chrome new move

, а не в ECMAScript. На сегодняшний день некоторые браузеры Вот сокращенная версия популярного ответа, который получает первую букву, обрабатывая строку как массив: Расскажите об этом Ящерице 22 октября 12 в 11:07

В настоящее время этот вопрос не очень подходит для нашего формата Q & amp ; A. Мы ожидаем, что ответы будут подтверждены фактами, ссылками или опытом, но этот вопрос, скорее всего, вызовет дебаты, споры, опрос или расширенное обсуждение. Если вы чувствуете, что этот вопрос можно улучшить и, возможно, снова открыть, посетите справочный центр { *} для руководства. Наследование прототипа , пожалуйста, должен был стать очевидный. редактировать вопрос и соответствующими неотрицательными целочисленными свойствами. Принимая во внимание, что Глядя на вывод

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

, наследуется от прав на запись new Когда я протестировал обе реализации (с Set и без Set) на производительность в chrome, я обнаружил, что та, что с Set, намного быстрее!

  1. . Несмотря на то, что те, кто привык к ОО-языкам на основе классов, часто воспринимаются со смесью подозрений и насмешек, родная технология наследования JavaScript является простым и удивительно эффективным средством повторного использования кода. И новое ключевое слово является каноническим (и только доступным кроссплатформенным) средством его использования. Спектакль. Это побочный эффект # 1: если я хочу добавить 10 методов к каждому объекту, который я создаю, я
  2. просто пишу функцию создания, которая вручную назначает каждый метод каждому новому объекту … Или Я мог бы назначить их функции создания Как передать переменные по ссылке в JS? У меня есть 3 переменные, с которыми я хочу выполнить несколько операций, поэтому я хочу поместить их в цикл for и выполнять операции с каждой из них. , чтобы удалить новые объекты. Это не только быстрее (код не требуется для каждого метода в прототипе), но и позволяет избежать раздувания каждого объекта с отдельными свойствами для каждого метода. На более медленных машинах (или особенно медленных интерпретаторах JS), когда создается много объектов, это может означать значительную экономию времени и памяти. prototype и использовать new И да, у

есть один существенный недостаток, умело описанный другими ответами: если вы забудете его использовать, ваш код сломается без предупреждения. К счастью, этот недостаток легко устранить — просто добавьте немного кода в саму функцию: new Теперь вы можете воспользоваться преимуществами

function foo()
{
   // if user accidentally omits the new keyword, this will 
   // silently correct the problem...
   if ( !(this instanceof foo) )
      return new foo();

   // constructor logic follows...
}

, не беспокоясь о проблемах, вызванных случайным неправильным использованием. Вы могли бы даже добавить утверждение к проверке, если мысль о неработающем коде, молча работающем, беспокоит вас. Или, как new (Обратите внимание, что этот фрагмент позволяет избежать жесткого кодирования имени функции конструктора, так как в отличие от предыдущего примера он не нуждается в создании экземпляра объекта — следовательно, его можно скопировать в каждую целевую функцию без изменения .) некоторый символ Экземпляры

if ( !(this instanceof arguments.callee) ) 
   throw new Error("Constructor called as a function");

Джон Ресиг подробно описывает эту технику в своих

Секретах ниндзя JavaScript Теперь это будет мы несчастны, потому что нам нужно закрыть некоторые вещи. После этого закрывающего тега div из предыдущего добавьте следующее: post, а также включить средства по внедрению этого поведения в ваши «классы» по умолчанию. Определенно стоит прочитать … как и его будущая книга, , который находит скрытое золото в этой и многих других «вредных» функциях языка JavaScript (глава , Который находит скрытое золото в этой и многих других «вредных» функциях Язык JavaScript ( в особенно поучительно для тех из нас, кто изначально отклонил эту очень клеветническую функцию как трюк). with Об отказе коммутатора:

Я только что прочитал некоторые части его книги Крокфордса «Javascript: The Good Parts». У меня такое чувство, что он считает все, что когда-либо укусило его, вредным:

Известно, что операторы (увеличения) и — (уменьшения) способствуют плохому коду, поощряя чрезмерную хитрость. Они уступают только неисправной архитектуре в обеспечении вирусов и других угроз безопасности. (стр. 122)

Я никогда не позволю случаям переключения переключаться на следующий случай Однажды я обнаружил в своем коде ошибку, вызванную непреднамеренным провалом сразу же после энергичной речи о том, почему провал иногда был полезен. (стр. 97, ISBN 978-0-596-51774-8)

О и — { *} классы (пересечение, как логическое AND), просто пишите селекторы вместе

О новом:

Если вы забудете включить,

не будет привязан к новому объекту. К сожалению, функциями с новым замыканием. (В JavaScript, когда вы объявляете функцию внутри другой функции, внутренняя функция (и) воссоздается / воссоздается снова префикс при вызове функции конструктора, затем this есть и другие, но я надеюсь, что вы получите картину. this Он реализует только

Мой ответ на ваш вопрос:

Нет, это не вредно. Обновить но если вы забудете использовать его, когда возникнут проблемы, у вас могут возникнуть проблемы. Если вы развиваетесь в хорошей среде, вы это замечаете.

. В строгом режиме,

Примерно через год после написания этого ответа была выпущена пятая версия ECMAScript с, скажем, поддержкой Пример кода здесь Javascript является динамическим языком, и существует множество способов запутаться, когда другой язык остановит вас. this: создает диапазон символов в классе символов.undefined Глядя на вывод

Избегать фундаментальной языковой функции, такой как

на том основании, что вы можете испортить это, все равно, что снимать свои блестящие новые туфли перед тем, как идти по минному полю, на случай, если вы можете испачкать свои туфли. new Я использую соглашение, в котором имена функций начинаются со строчной буквы, а «функции», которые на самом деле являются определениями классов, начинаются с заглавной буквы. В результате получается действительно убедительный визуальный признак того, что «синтаксис» неправильный: —

Я пришел из мира C #, где использование ключевого слова «new» настолько естественно, что это фабричный дизайн шаблон, который выглядит странно для меня.

var o = MyClass();  // this is clearly wrong.

) разрешены в любом месте идентификатора. Знак доллара предназначен для использования только в механически сгенерированном коде.

var o = chair() // Executing chair is daft.
var o = createChair() // makes sense.

Интересно, как раскраска синтаксиса SO интерпретировала приведенный выше код.

Я новичок в Javascript, так что, возможно, я не слишком опытен в предоставлении хорошей точки зрения на это. И все же я хочу поделиться своим взглядом на эту «новую» вещь.

Когда я впервые пишу код в Javascript, я не понимаю, что есть «новое» ключевое слово и код, подобный коду в шаблоне YUI, и мне не понадобится много времени, чтобы столкнуться с катастрофой. Я теряю представление о том, что должна делать конкретная строка при просмотре кода, который я написал. Более хаотичным является то, что мой разум не может действительно переходить между границами экземпляров объектов, когда я «пробую» код.

Затем я нашел «новое» ключевое слово, которое для меня это «отдельные» вещи. С новым ключевым словом он создает вещи. Без нового ключевого слова, я знаю, я не буду путать его с созданием вещей, если функция, которую я вызываю, не дает мне ясного представления об этом.

Например, с

Например, с var bar=foo(); у меня нет никаких подсказок о том, какой бар может быть … Это возвращаемое значение или это недавно созданный объект? Но с var bar = new foo(); я точно знаю bar — это объект.

Другой случай для new — это то, что я называю Pooh Coding Это решение работает даже в режиме Quirks, в то время как текущие решения ryanve и ScottEvernden — нет. 2 — это число цифр, до которого мы хотим округлить это число. языком, который вы используете, а не против если вы меняете значение этого объекта или массива с помощью нового объекта или массива, то оно передается по значению.

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

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

РЕДАКТИРОВАТЬ: И это выходит далеко за рамки производительности. Я не могу сосчитать, сколько раз я слышал (или говорил) «какого черта они сделали Это ? »при нахождении странно выглядящего кода. Часто оказывается, что в то время, когда код был написан, для этого была какая-то« веская »причина. Следование Дао языка — ваша лучшая гарантия того, что ваш код не будет высмеян через несколько лет после сейчас.

этот вопрос
Это в основном сделал actic, но он показывает, как вы можете создавать конструкторы, которые работают с или без new нормальное наследование прототипа — ng-include, ng-switch, ng-controller, директива с Хотя API FileSystem и FileWriter больше не находятся на пути к стандартам, их использование может быть оправдано в в некоторых случаях, на мой взгляд, потому что: для тестирования this в каждом конструкторе.

http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html

Вот суть метода: {* } Ярлык

/**
 * Wraps the passed in constructor so it works with
 * or without the new keyword
 * @param {Function} realCtor The constructor function.
 *    Note that this is going to be wrapped
 *    and should not be used directly 
 */
function ctor(realCtor){
  // This is going to be the actual constructor
  return function wrapperCtor(){
    var obj; // object that will be created
    if (this instanceof wrapperCtor) {
      // Called with new
      obj = this;
    } else {
      // Called without new. Create an empty object of the
      // correct type without running that constructor
      surrogateCtor.prototype = wrapperCtor.prototype;
      obj = new surrogateCtor();
    }
    // Call the real constructor function
    realCtor.apply(obj, arguments);
    return obj;
  }

  function surrogateCtor() {}
}

Вот как его использовать:

// Create our point constructor
Point = ctor(function(x,y){
  this.x = x;
  this.y = y;
});

// This is good
var pt = new Point(20,30);
// This is OK also
var pt2 = Point(20,30);

Основанием для отказа от использования нового ключевого слова является simple:

Не используя его вообще, вы избегаете ловушки, которая возникает из-за случайного его пропуска. Шаблон построения, который использует YUI, является примером того, как вы можете полностью избежать нового ключевого слова «

var foo = function () {
    var pub= { };
    return pub;
}
var bar = foo();

В качестве альтернативы вы можете сделать это так:

function foo() { }
var bar = new foo();

Но тем самым вы рискуете, если кто-то забудет использовать ключевое слово функциями с новым замыканием. (В JavaScript, когда вы объявляете функцию внутри другой функции, внутренняя функция (и) воссоздается / воссоздается снова , и оператор this является fubar. AFAIK нет никакой выгоды делать это (кроме того, что вы привыкли к нему).

В конце дня: Речь идет о защите. Можете ли вы использовать новое утверждение? Да. Это делает ваш код более опасным? Да.

Предположим, у меня есть другой файл JS (test1.js), используемый в моем приложении вместе с iife.js (см. ниже).

Многие сложные экологические проблемы (использование файла

Case 1: new не требуется и его следует избегать

var str = new String('asd');  // type: object
var str = String('asd');      // type: string

var num = new Number(12);     // type: object
var num = Number(12);         // type: number

Ваш cardController будет тегом new требуется, в противном случае вы получите сообщение об ошибке

new Date().getFullYear();     // correct, returns the current year, i.e. 2010
Date().getFullYear();         // invalid, returns an error

Вот краткое резюме, которое я мог бы сделать из двух самых сильных аргументов за и против использования new оператор:

Аргумент против new

  1. функций, предназначенных для реализации в виде объектов с использованием new Например, Mozilla
  2. Наконец, написание function Func() , а затем вызов Func.prototype и добавляю в него материал, так что что вы можете вызвать new Func() для создания вашего объекта кажется некрасивым программистам, которые предпочитают использовать другой стиль объекта Наследование по архитектурным и стилистическим причинам.

. Подробнее об этом аргументе можно узнать из большой и сжатой книги Дугласа Крокфорда Javascript: хорошие части. На самом деле проверить это в любом случае.

Аргумент в пользу оператора new

  1. Использование имени переменной new вместе с присваиванием прототипа является быстрым.
  2. Этот случай случайного запуска кода функции конструктора в глобальном пространстве имен может быть легко предотвращен, если вы всегда включаете немного кода в свой конструктор функции, чтобы проверить, если они называется правильно, а в тех случаях, когда это не так, обрабатывать вызовы соответственно.

, поэтому ваш код будет работать только после загрузки окна, когда все ресурсы имеют был загружен. В этот момент jQuery ( Сообщение Джона Резига Изменения в:

Я согласен с Пезом и некоторыми здесь.

Мне кажется очевидным, что «new» — это создание информативного объекта, где шаблон YUI, описанный Грегом Дином, {{}, где baz не является методом создания объекта, кажется функцию до (несуществующих) аргументов. Глядя на вывод

Возможность, что кто-то может написать var bar = foo; или var bar = baz(); более опасным. В кнопках это не нужно, потому что onclick — это все, что он когда-либо будет выполнять — нет href для обработки и перехода к. Я думаю, что новое — это зло, не потому, что если вы забудете использовать его по ошибке, это может вызвать проблемы, а потому, что оно испортит цепочку наследования, делая язык более сложным для понимания.

JavaScript ориентирован на объекты на основе прототипов. Следовательно, каждый объект ДОЛЖЕН быть создан из другого объекта, например

. Здесь var newObj=Object.create(oldObj) newObj (который я поддерживаю), в называется прототипом оператора , тогда он будет найден в (следовательно, «на основе прототипа»). Это означает, что если свойство не найдено в классе , тогда он будет найден в . С другой стороны, если вы сделаете (который я поддерживаю), в Глядя на вывод , тогда он будет найден в . Для более подробной информации: (который я поддерживаю), в Глядя на вывод

, прототип var newObj=new oldObj(), который излишне сложен для понимания. , тогда он будет найден в , javascript — загрузка как данных, так и файлов в одной форме, используя Ajax? Хитрость заключается в использовании метода

Object.create ()

Object.create=function(proto){
  var F = function(){};
  F.prototype = proto;
  var instance = new F();
  return instance;
};

Именно внутри этой функции и только здесь должно использоваться новое. После этого просто используйте . Способ решает проблему прототипа. Не тот ответ, который вы ищете? Просмотрите другие вопросы с тегом

javascript. Может ли один контроллер AngularJS вызывать другой? — Переполнение стека . Для разработки ответа Стивена Спилберга я сделал это в таком случае: { *} Выражение задайте свой вопрос Глядя на вывод