Revealing Prototype Pattern中的“this”

时间:2014-02-08 01:20:09

标签: knockout.js revealing-module-pattern

好的伙计们 - 一直在敲我的头。在使用从Revealing Prototype Pattern构建的类数组时,我觉得这是一个“指针”问题。另外,我正在使用knockoutjs进行绑定。

    问题:我的网站上通常包含非常复杂的页面。因此,我倾向于拥有包含其他类数组的类。我一直使用Revealing Prototype Pattern并且通常有一个“ self ”变量,在 init 函数中指向“ this ”,所以该类中由事件处理程序调用的其他函数将具有指向 this 的指针(并且它不会失败 - 它似乎知道“self”是什么)。

    但是 ....当我有一个类(模型)的数组时,它无法正常工作....我的 MailModel 类(我的viewmodel)有一个 ... 类中的“self”指向“this”,但是当其他原型函数调用“self”,它似乎指向数组中的 LAST “person”项? - 我在某种程度上将“self”暴露为它实例化的所有类的共享函数....并以某种方式指向“this”的最后一个实例??

我试图对包含“Person”类数组的viewModel进行简单的模型化。请有人帮我解决这个问题。我尝试过在“Person”类中使用这个“this”指针的不同方法,但无济于事。

看看吧!

http://jsfiddle.net/N8vxr/

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计算函数的更新小提琴:

http://jsfiddle.net/Sj25M/

1 个答案:

答案 0 :(得分:0)

self确实是Person.prototype.init的闭包变量,因此它被所有实例共享;一个实例改变了它,所有其他实例都看到了改变。这就是闭包的工作方式;被闭包“捕获”的是变量的引用,而不是实例化时变量的

我不确定你为什么首先需要它:每当调用Person.prototype中的任何方法时,this将指向正确的实例。如果其中一个方法需要调用需要实例作为闭包变量的匿名函数,它可以创建本地变量var self=this并使用它。