5

我将 Knockout.js 用于富客户端应用程序,它将包含大量的 knockout.js ViewModel。在开发过程中,我注意到了两种创建 knockout.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")};

这两种声明 ViewModel 的方法有什么具体区别吗?在knockout.js 官方页面示例中,他们使用了第一种方式。但是在像Knockout-validations.js这样的第三方框架中使用了第二种方式。我应该使用哪种方式?使用它有什么特别的优势吗?

我发现如果我使用第一种方式,那么我不能使用 Knockout-validations.js 框架。我对这个问题真的很困惑。任何评论表示赞赏。

谢谢你。

4

2 回答 2

3

第一种方式定义了一个对象构造函数但不实例化一个新对象,你可以通过这种方式传入参数。如果您正在创建多个对象/模型,这肯定会比第二种方式更简洁。

第二种方法是使用对象初始化器语法,这会在内存中使用您设置的任何字段来实例化一个新对象。一般来说,这会产生更小的代码大小;如果您要创建两个结构相同或相似的对象,请使用第一种方式。

没有理由不能使用第一个代替第二个。只需创建一个新对象并将其传递到需要的任何地方。

这:

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创建更多的 s,例如new AppViewModel("Joe", "Shmoe")

于 2012-09-28T06:07:54.887 回答
2

您描述的差异并非特定于淘汰赛或淘汰赛的库,而是在 JavaScript 社区中广泛争论的语言级别问题。JavaScript 大师 Douglas Crockford 有两篇关于这两个方面的文章:

从分散的论坛帖子、博客文章和与 JavaScript 程序员的对话来看,社区似乎正在趋向于接受原型风格。你应该使用你喜欢的任何风格。根据文档,看起来 Knockout-Validation 库的设计考虑了经典风格。在这种情况下,古典风格的优势在于它更容易与 Knockout-Validation 库一起使用。原型方式的缺点是很难与这个库一起使用。

于 2012-11-13T03:29:03.480 回答