Я ищу через выбивные учебники, и все примеры создания модели представления, используя «новое» ключевое слово:Создание яваскрипта нокаута ViewModel без нового ключевого слова
//from learn.knockoutjs.com
function AppViewModel() {
this.firstName = ko.observable("Bert");
this.lastName = ko.observable("Bertington");
this.fullName = ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this);
}
ko.applyBindings(new AppViewModel());
Я пытаюсь избегать использования новое ключевое слово, которое обычно работает отлично, но я нахожусь в затруднении, чтобы работать с полным вычислительным свойством. Это то, к чему я придумал.
function makeViewModel() {
return {
firstName: ko.observable("Bert"),
lastName: ko.observable("Bertington"),
fullName: ko.computed(function() {
return this.firstName() + " " + this.lastName();
}, this) };
}
ko.applyBindings(makeViewModel());
... который, очевидно, терпит неудачу, поскольку «это» больше не относится к локальному объекту внутри функции, переданной для вычисления. Я мог бы обойти это, создав переменную и сохранил модель представления, прежде чем присоединять вычисляемую функцию и вернуть ее, но если существует более элегантное и компактное решение, которое не требует от меня проверки того, что методы, зависящие друг от друга, прикрепленный в правильном порядке, я бы хотел использовать это вместо этого.
Есть ли лучшее решение?
Для меня самый важный вопрос: почему вы пытаетесь избежать нового ключевого слова? Как сказал Джон Папа, есть способы сделать объекты без новых, но почему?Это просто ваше предпочтение (вам не нравятся новые) или у вас есть определенные проблемы при его использовании? –
Я стараюсь избегать нового ключевого слова, пока не выясню это: http://jsperf.com/ffs-constructors – Zaz
@GeorgeMavritsakis: одна из причин, почему следует избегать «нового», - представить себе ущерб, который может быть причинен, если кто-то использует код забыл использовать 'new', например,' ko.applyBindings (AppViewModel()); 'Это добавит (или заменит значения' firstName', 'lastName' и т. д. в текущем контексте, возможно, окно браузера объект.Это может быть не слишком вредно.Но что, если конструктор включил строку, такую как 'this.Date = ...'? Вдруг конструктор Date был переопределен. Это одна из веских причин. –