В чем разница между этими двумя образцами кода?

Код 1:

var Something = {
name: "Name",
  sayHi: function(){
     alert(Something.name);
  }
}

Код 2:

 function Something(){
    this.name = "Name";
 }

 Something.prototype.sayHi = function(){
    alert(Something.name);
 }

Edit: Итак, Парни, ты имеешь в виду, что Второй лучше? или более "формальный"?

Ответ 1

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

В вашем втором примере вы определяете функцию-конструктор, которая может использоваться с оператором new для создания экземпляров объекта.

Литералы объектов могут также использоваться для создания новых экземпляров объектов и выполнения прототипного наследования, Дуглас Крокфорд также поддерживает эту технику.

В принципе, вы можете иметь оператор object:

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

Эта вспомогательная функция может использоваться очень интуитивно понятным и удобным способом.

В основном он получает объект как параметр, внутри функции создается экземпляр нового объекта, старый объект привязан к прототипу нового объекта и возвращается.

Его можно использовать следующим образом:

var oldObject = {
  firstMethod: function () { alert('first'); },
  secondMethod: function () { alert('second'); },
};

var newObject = object(oldObject);
newObject.thirdMethod = function () { alert('third'); };

var otherObject = object(newObject);
otherObject.firstMethod();

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

Рекомендуем:

Ответ 2

В первом фрагменте кода Something - простой объект, а не конструктор. В частности, вы не можете позвонить:

var o = new Something();

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

В втором фрагменте Something является конструктором, и с ним можно использовать ключевое слово new.

Edit:

Кроме того, во втором фрагменте, так как вы используете Something.name, а не this.name, он всегда будет предупреждать имя самого конструктора, что является "Кое-что", если вы не переопределите это свойство с чем-то вроде Something.name = "Cool";.

Вероятно, вам нужна эта строка:

alert(this.name);

Ответ 3

В первом примере вы можете сделать

Something.sayHi();

а во втором вы должны это сделать

new Something().sayHi();