0

好的,伙计们-一直在敲我的头。在使用从显示原型模式构建的一系列类时,我觉得这是一个“指针”问题。另外,我正在使用 knockoutjs 进行绑定。

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

但是......当我有一个类(模型)的数组时,它不能正常工作......我的MailModel类(我的视图模型)有一个People 类的数组...... People 类中self”被指出到"this",但是当原型的其他函数调用 "self" 时,它似乎指向数组中的最后一个 "person" 项??-我是否以某种方式将“self”公开为它实例化的所有类的共享函数......并以某种方式指向“this”的最后一个实例?

我试图做一个包含“Person”类数组的视图模型的简单模型。请有人帮我解决这个问题。我尝试了在“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 实例的原型函数(所以“this”不起作用)-我已经更新了我的 jsFiddle 用 totalNums KnockoutJS 计算函数来显示 Person 原型,如果我把“this”放在那个函数中,它会失败,因为“this”是“Window”对象——和以前一样,你可以看到使用“self " 只是指数组中的最后一个人(注意每个人的“totalNums”是 80​​ (Suzy Chapstic)

如果我将“totalNums”向上移动到构造函数中,那很好,但我希望我的函数在原型中向下。那么......我怎样才能在原型上的计算函数中获得对“this”实例的引用?

这是这个 KnockoutJS 计算函数的更新小提琴:

http://jsfiddle.net/Sj25M/

4

1 回答 1

0

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

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

于 2014-02-08T05:51:01.057 回答