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)
我正在努力想出一种存储真正私有变量的方法.如果灵感来袭,我会回复.