是否可以在模型中使用私有属性?就像(构造函数)函数中的本地声明的变量一样,没有附加到this
,而是在本地声明,只能通过(构造函数)函数中定义的任何内容来显示。
没有BB视图的示例:
function MyView(aModel){
var $internalInput = $('<input>');
this.render: function($where){
$internalInput.val(aModel.get('SomeProperty'));
$where.append($('<div class="inputWraper">').append($internalInput));
};
this.toggleReadonly: function() {
toggle $internalInputs readonly attribute
}
...
+ Code to bind input.val to some aModel property(ies) and setup events
...
}
请注意,外部世界无法访问internalInput
,并且aModel
也无法访问(至少通过MyView)。
因此,如果我想使用Backbone.View来实现上面的MyView,我该如何做并保持$ internalInput'private'?
答案 0 :(得分:10)
在定义Backbone对象时,您应该能够通过将IIFE传递给extend
来实现私有数据,而不仅仅是普通对象。例如:
var Thing = Backbone.Model.extend((function () {
var foo = "Private data!";
return {
bar: function () {
console.log(foo);
}
};
})());
答案 1 :(得分:3)
你最好用
var Thing = Backbone.Model.extend(
{
constructor : function ()
{
var _value = "Private data!";
this.getValue = function ()
{
return _value;
};
this.setValue = function (value)
{
_value = value;
};
}
});
答案 2 :(得分:0)
Javascript很有趣!
var Thing = (function () {
var number_of_things = 0;
return function (options) {
var value = "Private data!";
return new ( Backbone.Model.extend({
constructor: function constructor () {
number_of_things += 1;
},
getValue: function getValue () {
return value;
}
}) )();
};
}());
我有点担心这个“Thing”的每个实例在OOP术语中也是一个子类。
答案 3 :(得分:0)
在使用Broserify.js与Backbone(以及任何上述中型项目)的上下文中,我找到了以下方式来获得私有变量和函数:
myView.js
'use strict';
var config = require('../config.js'),
private_var = 'private variable',
my_private_fn = function() {
...
};
module.exports = Backbone.Model.extend({
initialize: function() {
this.my_public = 'public variable');
console.log('This is my' + this.my_public);
console.log('This is my' + my_private);
},
});
这里采取的想法是使用Browserify:P
答案 4 :(得分:0)
最简单的方法如下:
...
initialize:function(properites){
// Init the logic with private and public methods/variable
this.logic.initFirst(this);
// Use public methods
this.logic.doSomething();
},
logic:{
initFirst:function(modelOrView){
// Do not continue if already initiated
if( this.instance !== undefined ) return;
// Write all logic here
this.instance = (function(logic, modelOrView){
// Private variables
var private = "private";
// Public methods
logic.doSomething = function(){
console.log(private, modelOrView);
};
// Private methods
function hidden(){
}
}(this, modelOrView));
}
},