代码改变世界

Javascript用闭包实现领域建模

2012-10-17 09:43  秋日愚夫  阅读(283)  评论(0编辑  收藏  举报

开篇,因工作试用期中需要做个javascript树的练习,在此过程中发现自己此方面知识较少。于是做了点功课。

了解了javascript是弱类型语言。无块级作用域。原型继承。闭包。危险的全局变量。等知识。。也渐渐喜欢上了其原型继承的方式。

 

昨天在看一本html5+css3书的时候,看到一段关于绘制图形的javascript代码其中,有几句很有意思。

var context=getContextById('dd');
context.Width(100);
context.Hight(200);
context.MoveTo(200,200);

从此可以看得出 context通过一系列方法,操作同一个object.
这种构造上下文对象的方式,可以通过闭包来实现。按照自己的想法写一下其内部实现。
如下:

var context=function() {
       var contextObj={width:0,hight:0};
       return  {
                Width:function(width){ contextObj.width=width; return this;}
                Hight:function(hight) { contextObj.hight=hight; return this}                  
       } 
    }();

这样看起来,非常像领域建模中的领域模型。把某一业务类相关的操作,封装在一起,形成一个内聚的新对象。

通过这样的封装生成的对象,我们可以对其方法进行重写,而不影响其它实例对象。

 

<!DOCTYPE html>
 
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title></title>
 
        <script type="text/javascript">
 
            var a, b;
 
            var TestContext = function () {
                var contextObj = { width: 100, height: 100 };
 
                return {
                    width: function (width) { contextObj.width = width; return contextObj; },
                    hight: function (hight) { contextObj.height = hight; return contextObj; }
                };
            };
 
 
            a = TestContext().width(120);
            alert("a:" + a.width);
 
            b = TestContext().width(290);
            alert("b:" + b.width);
            //此实例的width没有被 b 的修改掉。
            alert("a:" + a.width);     
</script> </head> <body> </body> </html>