Показать сообщение отдельно
  #1 (permalink)  
Старый 12.02.2014, 14:09
Интересующийся
Отправить личное сообщение для Universe Посмотреть профиль Найти все сообщения от Universe
 
Регистрация: 11.06.2011
Сообщений: 20

Какой способ создания объектов более правильный?
Добрый день. Занялся JS после того как довольно долгое время уже работал с AS3 и успел привыкнуть к ООП радостям этого языка. В JS же как то всё не однозначно. Сейчас рассматриваю наследование и разные способы создания объекта. На сколько я успел узнать в JS есть как минимум 3 разных способа создать дочерний объект от родительского (унаследовать):
1. Через функцию конструктор
function Person(name, address)
    {
        if(!(this instanceof Person))return new Person(name, address);
        this.name = name;
        this.address = address;
    }
    Person.prototype.sayHello = function()
    {
        console.log(this.name + " says hello");
    }
    window.Person = Person;

2. При помощи Object.create();
var parent = {a:1};
var child = Object.create(parent);

3. Через "фабрику" объектов:
// конструктор базовых объектов
function base(spec) {
    var that = {}; // создать пустой объект
    that.name = spec.name; // создать свойство name и присвоить ему значение name от spec
    return that; // вернуть этот объект
}
 
// конструктор объектов, наследующих от "базового" объекта
function child(spec) {
    var that = base(spec); // создать объект с помощью "базового" конструктора
    that.sayHello = function() { // добавить фунцкию в новый объект
        return 'Hello, I\'m ' + that.name;
    };
    return that; // вернуть этот объект
}
 
// использование
var object = child({ name: 'a functional object' });
result.textContent = object.sayHello();

Вопрос собственно с следующем: какой из представленных вариантов более приемлемый в повседневном использовании? Возможно у описанных вариантов есть свои подводные камни или на выходе созданные объекты будут идентичными вне зависимости от способа их создания?

Последний раз редактировалось Universe, 12.02.2014 в 14:11.
Ответить с цитированием