私有和公共变量到骨干视图

Cha*_*erj 13 javascript private backbone.js

在骨干视图中,您可以将私有变量和公共变量放在哪里.

现在我有这样的事情:

myView = Backbone.View.extend({

  initialize: function(options){
    this.myPublic = "I'm public";
  }

});
Run Code Online (Sandbox Code Playgroud)

我尝试var myPrivate在initialize方法之前添加一个但是它引发了一个错误.仅在视图中使用的私有变量在哪里?

Nea*_*man 19

我建议你使用initialize方法作为围绕所有其他方法的闭包.我认为这将使您的行为与我们在C++和Java等经典继承语言中获得的行为更加一致:


myView = Backbone.View.extend({

  initialize: function(options){
    var myPrivate = "I'm private";

    this.myPublic = "I'm public";

    this.getPrivate = function () {
      return myPrivate;
    };

    this.setPrivate = function (value) {
        if (typeof(value) === 'string') {
            myPrivate = value;
            return true;
        } else {
            return false;
        }
    };
  }
});


gil*_*ly3 11

将它全部包含在一个自动调用的匿名函数中:

(function() {
    var myPrivate = 1;

    myView = Backbone.View.extend({  
        initialize: function(options){  
            this.myPublic = "I'm public";
            myPrivate++;
        },
        render: function() {
            alert(myPrivate);
        }
    });

})();
Run Code Online (Sandbox Code Playgroud)

编辑:正如下面kaustubh的评论中所指出,上面的例子创建了一个在实例之间共享的私有变量.您可以创建一种受保护的变量,即可以由View的其他实例读取的实例级变量.为每个实例提供唯一的公共ID,并将实例变量存储在"private static"变量中.然后通过实例id访问变量:

(function() {
    var data = [];

    myView = Backbone.View.extend({  
        initialize: function(options){  
            this.myPublic = "I'm public";
            this.Id = data.length;
            data.push({});
            data[this.Id].myProtected = "abc";
        },
        render: function() {
            alert(data[this.Id].myProtected)
        }
    });
})();
Run Code Online (Sandbox Code Playgroud)

或者,您可以在不使用公共ID的情况下执行此操作,但它会变得更复杂:

(function() {
    var data = (function () {
        var dataValues = [];
        return function (instance) {
            for (var i = 0; i < dataValues.length; i++) {
                if (dataValues[i].instance === instance) {
                    return dataValues[i].data;
                }
            }
            var dataObject = { instance: instance, data: {} };
            dataValues.push(dataObject);
            return dataObject.data;
        };
    })();

    myView = Backbone.View.extend({
        initialize: function(options){  
            this.myPublic = "I'm public";
            data(this).myProtected = "abc";
        },
        render: function() {
            alert(data(this).myProtected)
        }
    });
})();
Run Code Online (Sandbox Code Playgroud)

我正在努力想出一种存储真正私有变量的方法.如果灵感来袭,我会回复.