一种将(添加隐私)封装到 MVC 中的模型的方法?
Posted
技术标签:
【中文标题】一种将(添加隐私)封装到 MVC 中的模型的方法?【英文标题】:A way to encapsulte ( add privacy ) to models in the MVC? 【发布时间】:2012-08-02 00:27:10 【问题描述】:我命名我的模型和一个这样的控制器:
var MC = ;
然后根据需要添加属性。
例如,初始化我所有模型的代码如下所示:
MC.initAll = function()
MC.MASettings.init();
MC.MATweet.init();
MC.MUserTry.init();
MC.MUserNew.init();
MC.MUserExist.init();
Su.UserOut.init();
Su.Media.init();
我打算把它改成一个循环...只要循环通过 MC,如果 init() 存在就执行它。
这种架构唯一让我困扰的是,没有传统意义上的隐私或封装,即一切都是公开的。
另外,我不实例化我的模型,我只是将它们称为函数,但这与 .js 中的实例化几乎相同。
有没有一种简单的方法可以为我的模型添加隐私,并且仍然可以将它们作为对象中的属性进行访问。
这里只是一个例子,是我最简单的模型:
MC.MUserTry =
init: function()
document.getElementById( 'ut_but' ).addEventListener( "click", function( )
MC.Controller( MC.o_p( 'MUserTry' ) );
, false );
,
pre : function( o_p )
o_p.page.email = document.getElementById( 'ut_but' ).getAttribute( 'data-email' );
return o_p;
,
post : function( o_p )
sLocal( o_p.server.hash, o_p.server.privacy, o_p.server.name, o_p.server.picture, 'ma' );
vStateUpdate( o_p.server.name, o_p.server.picture, o_p.server.privacy );
vTPane( o_p.server.tweets ); vBPane( o_p.server.bookmarks );
vFlipP( 'ma' );
;
pre() 在 ajax 调用之前运行,post() 之后运行,init() 通过 onload 事件或类似事件调用。
这里是实际实现这个的控制器。
MC.Controller = function( o_p )
console.log( 'o_p = ' + o_p.model );
var t1, t2, t3, t4,
i1, i2, i3, i4,
o_p_string_send;
if( SU.get('debug') )
t1 = new Date().getTime();
o_p = MC[ o_p.model ].pre( o_p );
if ( o_p.result !== 'complete' )
o_p_string_send = JSON.stringify( o_p );
if( SU.get('debug') )
t2 = new Date().getTime();
console.log( '---------------Server Send: \n ' + o_p_string_send );
cMachine( 'pipe=' + o_p_string_send , function( o_p_string_receive )
if( SU.get('debug') )
console.log( '---------------Server Receive: \n ' + o_p_string_receive );
t3 = new Date().getTime();
o_p.server = JSON.parse( o_p_string_receive );
MC[ o_p.model ].post( o_p );
if( SU.get('debug') )
t4 = new Date().getTime(); i1 = t2-t1 ; i2 = t3-t2 ; i3 = t4-t3; i4 = o_p.server.time;
console.log( '---------------Time: \n Pre | Transit | Post | Server = ', i1, ' | ', i2, ' | ', i3,' | ', i4 );
);
;
我想添加隐私。如何做到这一点,并且仍然保持我的模型作为对象属性可访问?
相关
How to create global, instance based objects from local scope?
【问题讨论】:
那么,您希望整个MUserTry
对象是私有的吗?
从哪里可以使用该接口?这完全是范围问题。
但是该控制器将被定义为MC
模块的一部分?
【参考方案1】:
有没有一种简单的方法可以为我的模型添加隐私,并且仍然可以将它们作为对象中的属性进行访问?
显然,您需要将整个对象设为私有。是的,这也可以像 javascript 中的任何其他隐私一样工作 - 闭包。
看看module pattern(网上有很多关于这个的教程)。
【讨论】:
闭包是一个函数。它只是具有导出您可能需要的界面的好处。 它只需要对调用它的部分公开,在你的情况下似乎是Controller
。如果两者都定义在同一个范围内,它们仍然不需要是全局的。
没有。 closures do "export" (a) 函数公开,但仍然可以访问内部的“私有”变量。
是的。该方法现在可以公开访问,是在一个范围内声明的,它可以引用从外部不可用的“私有”事物。
“普通函数”是什么意思?您将无法从外部访问在其范围内声明的变量。它们通常会在函数执行完成后被垃圾回收。【参考方案2】:
你可以用闭包做到这一点。
var MyNamespace = ;
MyNamespace.MyClass = (function()
function privateMethod()
// ...
function publicMethod()
// can call privateMethod() from in here
return (
publicMethod: publicMethod
);
());
这将创建一个名为MyNamespace.MyClass
的对象,其中包含一个私有方法和一个公共方法。在您的情况下,您可能希望为每个模型类执行此操作。让他们的 init
方法公开并隐藏他们的其他方法。
【讨论】:
MyNamespace.MyClass.publicMethod();
MyClass
将获得具有publicMethod
属性的对象。
如果您在启动时只运行此代码一次,那么不,内部函数不会被创建多次。他们怎么可能?这段代码运行一次,MyNamespace.MyClass
被赋予了一个匿名函数的返回值(该返回值只是一个只有一个属性的对象:'publicMethod'),就是这样。以上是关于一种将(添加隐私)封装到 MVC 中的模型的方法?的主要内容,如果未能解决你的问题,请参考以下文章