Подтвердить что ты не робот

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

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

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

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

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

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

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

  • Какова значимость анонимной функции .

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

4b9b3361

Ответ 1

Существует (фундаментальная, на мой взгляд) разница между объектными литералами и функциями, переменными "private". Поскольку объект не может быть создан (поскольку он уже является экземпляром Object), он не имеет возможности иметь свою собственную (новую) область. Это базовая концепция усовершенствованного JS-программирования. Наличие новой области позволяет делать практически все (вы можете объявить свои собственные window, document или все, что хотите, кроме ключевых слов 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
  • У него есть частные переменные

И Object s?

  • Это есть a Object
  • У него нет своего Prototype, но вы можете объявить функции и расширить сам объект
  • У него нет частных переменных

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

Посмотрите, что может сделать прототип функции:

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

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

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

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

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

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

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

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

Ответ.

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

Да, вы можете, если вам не нужны частные переменные (и если script не слишком большой. Представьте 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 - это только ссылка для эффективной функции (которая не называется, поэтому она не может быть вызвана из script).

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

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

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