Объектный литерал против конструктора + прототип

Объектный литерал= имя-значение пары, завернутые в фигурные скобки.

Конструктор= функция, используемая для создания нескольких экземпляров с использованием ключевого слова new.

Прототип= для расширения литерала.

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

КакойЛучший предпочтительный способ программирования (объектные литералы против конструкторов против прототипа)

Можно ли написать код с конструктором и прототипом, используя только объектные литералыбез используя конструктор и прототип.

в чем значениеанонимная функция.

Также подойдет очень простой пример, демонстрирующий их важность. Я знаю, что они есть, но я не знаю, какую возможную магию они могут сделать.

 user241257523 июн. 2013 г., 14:09
: хороший вопрос в рамке
 HIRA THAKUR23 июн. 2013 г., 14:43
любой желаемый функционал ... я хочу сказать
 Niccolò Campolungo23 июн. 2013 г., 14:42
Что вы подразумеваете под "желаемый функционал "?

Ответы на вопрос(1)

Решение Вопроса

ералами и функциями:частный" переменные. Поскольку объект можетбыть создан (потому что это уже экземплярObject) у него нет возможности иметь свое (новое)объем, Это базовая концепция передового программирования JS. Наличие новой области позволяет вам делать почти все (вы можете заявить о своей собственной,windowdocument или что вы хотите, кроме JSключевые слова внутри вашей собственной сферы). Теперь несколько простых примеров:

Позволять'Предположим, что вы хотите создать большое количество экземпляров одного и того же объекта (используя как можно меньше строк):

function MyObj(i) {
    var privateCounter = "I am the instantiated object " + i + " .";
    this.counter = function() {
        return privateCounter;
    };
}

var MyObjList = [],
    ObjLitList = [];
for (var i = 0; i < 100; i++) {
    MyObjList.push(new MyObj(i));
    ObjLitList.push({counter: "I am the literal object number " + i + "."});
}

Теперь у вас есть 200 объектов, которыепочти, но нетточно, тоже самое. Вы можете расширить их по своему усмотрению, потому что функцииявляются объекты, но в случае функции вы не можете получить доступ кprivate переменная напрямую. Позволять'Посмотрим, каковы преимущества функции:

Это рассматривается какObjectИмеет свойPrototypeУ него есть личные переменные

ИObjects?

Этоявляется ObjectЭто нет свойPrototype, но вы можете объявить функции и расширить сам объектЭто нене может иметь частные переменные

Помимо частных варов, они мало чем отличаются друг от друга.

Позволять'посмотрим что за функцияС прототипом можно сделать:

MyObj.prototype.setX = function(x) {
    this.x = x;
}

Использование прототипа позволяет создать единственный экземпляранонимная функция(который может быть назван тоже, а затем назначен), который будет использоваться для всех экземпляров. Как вы можете сделать то же самое с объектными литералами?

function setX(x) {
    this.x = x;
}
var obj = {
    setX: setX
};

Как вы можете видеть, вы должны создавать объект, определяющий каждый раз свойство, котороеsetX, В противном случае вы можете продлитьObject.prototype сам по себе (но есть длительные дебаты о расширении прототипа нативных объектов JS).

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

Я предпочитаю писать свои собственные функции и относиться к ним как к классам, потому что они более читабельны, и я могу их использовать »частный" переменные. Я неНе знаю никого, кто бы использовал литералы вместо функций.

Что касается вопросов:

Какой метод программирования лучше всего подходит (литералы объектов против конструкторов против прототипа)

Ответил.

Можно ли написать код с конструктором и прототипом, используя только объектные литералы, без использования конструктора и прототипа.

Да, вы можете, если вы нене нужны приватные переменные (и если скрипт неслишком большой. Представьте, что jQuery написан как литерал объекта: D).

в чем значение анонимной функции.

Ну что ж, я могу ответить с примером:

//code
myNamedFunction();
//code
function myNamedFunction() {
    alert("I'm defined everywhere! :)");
}

Это работает и выигралт генерировать.TypeError

myAnonymousFunction();
var myAnonymousFunction = function() {
    alert("I'm defined after this declaration :(");
}
myAnonymousFunction(); // works!

Это приведет кUncaught TypeError: undefined is not a function, так какmyAnonymousFunction это толькоссылка к эффективной функции (которая безымянна, поэтому она не вызывается из скрипта).

Есть много вещей, которые можно сказать об этом аргументе, и хороший момент для начала продвинутого программированияJavascript Garden, Другие хорошие чтенияОсновы ООП в JS - NetTutsPlus,Работа с объектами - MDN а такжеООП в JS - Phrogz

Надеюсь это поможет!

Sidenote: функции также имеют хорошее преимущество, так как они могут изменять свой контекст (this) просто с функцией (call например), в то время как объекты могутт.

 snw08 мар. 2014 г., 17:33
Если я правильно понял, ошибка TypeError, сгенерированная в анонимной функции во втором примере, связана с переменнойmyAnonymousFunction был объявлен и не определен в верхней части скрипта, следовательно,TypeError undefined is not a function, Связано с JS.hoisting
 Niccolò Campolungo23 июн. 2013 г., 16:12
Это приватно и не доступно извне функции
 HIRA THAKUR23 июн. 2013 г., 16:26
MyObjList.push (новый MyObj (i)); -------------------- 1 ObjLitList.push ({counter: "Я .......}) ---------- 2 В чем разница между 1 и 2. Является ли этот экземпляр так же, как конструктор, используя новое ключевое слово.
 Amin Mohamed Ajani30 июн. 2016 г., 09:02
Этот ответ сделал мою жизнь достойной жизни. Спасибо Нико
 HIRA THAKUR23 июн. 2013 г., 16:11
что если я напишу var counter вместо this.counter = function () {} ???
 Niccolò Campolungo29 июл. 2014 г., 10:35
Спасибо, приятель, я очень ценю это. :)
 Niccolò Campolungo23 июн. 2013 г., 16:33
Да, первый экземпляр создается с помощью функции MyObj, второй - с помощью JS 'Компилятор s ({} оценивает new Object () и установку свойств). Как я уже сказал, нет никакой разницы между функцией (которая является самим объектом) и литералом объекта, кроме приватных переменных. Все в JS в "istantiated»! Если вы делаете var n = 2, это число!
 Niccolò Campolungo08 мар. 2014 г., 18:58
Да, это. Но в то время, когда я написал ответ, я неЯ еще так хорошо знаю о JS 'Я пытался оправдать это безо всяких доказательств. Переменная поднимается вверху скрипта, но имеет значение undefined, которое не является функцией, следовательно, TypeError. Фактически, если вы попытаетесь вызвать функцию, которая даже не объявлена, вы получите ReferenceError, сообщив "х не определен, который сильно отличается от "не определено» :) спасибо за указание, надеюсь, было ясно!
 gmsecrieru01 июн. 2016 г., 21:38
Спасибо за это. Если я могу предложить исправление дляUncaught TypeError пример от звонкаmyAnonymousFunction(), причина этой ошибки в том, что только переменнаядекларация поднят (например,var a;), а не атрибуция (например,a = 'foo';)Это означает, что это даже не ссылка на функцию в этой точке. Тот'почему ты нене иметьReferenceError, что в этом случае означало бы, что переменная не былаобъявленный в исполняемой или вложенной области (ях).
 Sai Gudigundla05 авг. 2014 г., 05:09
Спасибо @LightStyle. Это очистило меня от путаницы между объектными литералами и конструктором + прототип. Заявление, которое вы сделали ({} для нового Object ()), многое проясняет для меня.
 Rishul Matta29 июл. 2014 г., 07:29
один из лучших ответов, которые яЯ когда-либо читал. Это замечательная практика - цитировать ваши ссылки в конце, большое спасибо.

Ваш ответ на вопрос