问题:我的网站上通常包含非常复杂的页面。因此,我倾向于拥有包含其他类数组的类。我一直使用Revealing Prototype Pattern并且通常有一个“ self ”变量,在 init 函数中指向“ this ”,所以该类中由事件处理程序调用的其他函数将具有指向 this 的指针(并且它不会失败 - 它似乎知道“self”是什么)。
但是 ....当我有一个类(模型)的数组时,它无法正常工作....我的 MailModel 类(我的viewmodel)有一个 ... 人类中的“self”指向“this”,但是当其他原型函数调用“self”,它似乎指向数组中的 LAST “person”项? - 我在某种程度上将“self”暴露为它实例化的所有类的共享函数....并以某种方式指向“this”的最后一个实例??
我试图对包含“Person”类数组的viewModel进行简单的模型化。请有人帮我解决这个问题。我尝试过在“Person”类中使用这个“this”指针的不同方法,但无济于事。
看看吧!
var $results = $('#results');
var Person = function(data) {
this.id = ko.observable();
this.name = ko.observable();
this.init(data);
}
Person.prototype = function(){
var self,
init = function(data){
self = this;
self.id(data.id || 0)
.name(data.name)
},
sayHi = function(){
$results.find('.wrong').text(self.name()).end()
.find('.correct').text(this.name()).end()
.show();
};
return {
init: init,
sayHi: sayHi
}
}();
var MainModel = function(people){
this.people = ko.observableArray([]);
this.init(people);
}
MainModel.prototype = function(){
var self,
init = function(people){
self = this;
_.each(people, function(person){
self.people.push(new Person(person));
});
/* do lots of other stuff */
};
return {
init: init
}
}();
var people = [
{id: 1, name: 'Bill Smith'},
{id: 2, name: 'John Doe'},
{id: 3, name: 'Suzy Chapstick'},
];
var vm = new MainModel(people);
ko.applyBindings(vm);
的更新:
我看到评论想知道为什么我不会在我的调用中使用“this” - 在我的情况下,我还有其他东西调用这些原型函数而不是person实例(所以“这个”不起作用) - 我已经更新了我的jsFiddle,以显示带有totalNums KnockoutJS计算函数的Person原型 - 如果我将“this”放在该函数中,它会失败,因为“this”是“Window”对象 - 和以前一样,你可以看到使用“self”只是指数组中的最后一个人(注意每个人的“totalNums”是80(Suzy Chapstic)
如果我将“totalNums”移动到构造函数中,那很好,但我希望我的函数在原型中。 那么......我怎样才能在原型上的那个计算函数中获得对“this”实例的引用?
这是KnockoutJS计算函数的更新小提琴:
答案 0 :(得分:0)
self
确实是Person.prototype.init
的闭包变量,因此它被所有实例共享;一个实例改变了它,所有其他实例都看到了改变。这就是闭包的工作方式;被闭包“捕获”的是变量的引用,而不是实例化时变量的值。
我不确定你为什么首先需要它:每当调用Person.prototype
中的任何方法时,this
将指向正确的实例。如果其中一个方法需要调用需要实例作为闭包变量的匿名函数,它可以创建本地变量var self=this
并使用它。