Декларация View-Model для Knockout.js. Есть два метода

Я использую Knockout.js для богатого клиентского приложения, и оно будет состоять из большого количества ViewModels Knockout.js. В процессе разработки я заметил два способа создания ViewModel нокаута.js. Первый способ.

function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");}

Второй способ.

var appViewModel = {
this.firstName = ko.observable("Bert"),
this.lastName = ko.observable("Bertington")};

Есть ли какая-то конкретная разница в этих двух методах объявления ViewModels? В примерах официальных страниц knockout.js они использовали первый способ. Но в сторонних фреймворках, таких как Knockout-validations.js, используется второй способ. Какой способ я должен использовать? Есть ли конкретное преимущество в его использовании?

Я обнаружил, что если я использую первый способ, я не могу использовать структуру Knockout-validations.js. Я действительно запутался в этом вопросе. Любой комментарий приветствуется.

Спасибо.


person Thilok Gunawardena    schedule 28.09.2012    source источник
comment
Вот еще одна ссылка, которая может помочь: stackoverflow.com/questions/9589419/   -  person RP Niemeyer    schedule 28.09.2012


Ответы (2)


Первый способ определяет конструктор объекта, но не создает экземпляр нового объекта, таким образом вы можете передавать аргументы. Если вы создаете несколько объектов/моделей, это определенно будет менее неуклюжим, чем второй способ.

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

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

Этот:

function AppViewModel(fName, lName) {
    var self = this;
    self.firstName = ko.observable(fName);
    self.lastName = ko.observable(lName);
}
...
var appViewModel = new AppViewModel("Bert", "Bertington");

создает тот же объект, что и этот:

var appViewModel = {
    this.firstName = ko.observable("Bert"),
    this.lastName = ko.observable("Bertington")
};

Первый просто позволяет создавать больше AppViewModel, например. new AppViewModel("Joe", "Shmoe")

person Royce Feng    schedule 28.09.2012

Описываемая вами разница не относится к библиотекам нокаута или нокаута, а скорее является проблемой на уровне языка, широко обсуждаемой в сообществе JavaScript. У Дугласа Крокфорда, гуру JavaScript, есть две статьи по обеим сторонам вопроса:

Судя по разрозненным сообщениям на форумах, статьям в блогах и беседам с программистами JavaScript, сообщество склоняется к принятию прототипного стиля. Вы должны использовать любой стиль, который вы предпочитаете. Судя по документации, похоже, что библиотека Knockout-Validation была разработана с учетом классического стиля. Преимущество классического стиля в этом случае будет заключаться просто в том, что его проще использовать с библиотекой Knockout-Validation. Недостатком прототипного способа является то, что его сложнее использовать с этой библиотекой.

person Carl Schroedl    schedule 13.11.2012