美文网首页
从javascript本没有工厂模式说起

从javascript本没有工厂模式说起

作者: 叮宕 | 来源:发表于2018-11-03 23:11 被阅读8次

说实话,人都是很固执的,我当然承认这种固执。
这是一篇反思自己的固执的文章,当然为了没有什么暴露的风险,我从javascript说起。

这家伙,我的第一印象一直不怎么好,想到它也只是我想操作一些dom的元素,或者让它们完成一些提交表单前的验证。

我对于javasctipt的感觉就是使用混乱,语法混乱,写代码的累,看代码的更累。但是你知道你的固执总会被周遭的环境所打脸,当我发现javasctipt在统一全平台后,我知道我错了。

伴随着nodejs的发扬光大,它可以用来作为后台的代码,可以用来作前台的代码,它还可以用来构建漂亮的跨平台的桌面ui。

当然我也不是那么这么肤浅,这东西开始流行,我就开始改观,我可是很固执的人 。我的改观真正来源于偶然看到的commenjs的标准。

这个规范彻底改观了我对javasctipt的影响,他从一个大街上扫地的变成了少林寺的扫地僧。在我举第一个例子之前,我真的建议所有使用javascript的人读一下这个规范,我把它的地址,附在下一句话之前:
http://javascript.ruanyifeng.com/nodejs/module.html

好我开始举第一个惊艳到我的例子,这个例子可以描述为这样的问题,javascript怎么引入依赖。如果你用过pyhton,java,php就知道我在说什么,在其它语言像这样:
from XXX import XXX
它的后面是什么,是不得已而为之的命名空间的机制,在上面三个中,第一个最要吐槽的是php,在没有composer之前的日子里,php在这方面是在是太难用了,好,按下不表。

javasctipt 里commentjs对这方面的设计呢?简洁的令人发指,但是这样才现功力:)

在commenjs中,有三个看一眼就懂的三个定义:模块定义,模块标识,模块引用。

当然我不从模块定义说起,我们从客户端的角度来看,从模块的引用说起:

var example = require('./example.js');
console.log(example.x); // 5
console.log(example.addX(1)); // 6

好了,谁都能看懂的模块引用代码,这有什么的?你一定这样想,我们来看模块的定义,它非常简单,一个文件就是一个模块,有自己的作用域。

好,你如果没骂我就说明我没有写对,那个example.x的5是怎么输出的,addX方法是怎么输出的。

对的

CommonJS规范规定,每个模块内部,module变量代表当前模块。这个变量是一个对象,它的exports属性(即module.exports)是对外的接口。

我再加一句提醒,exports属性是模块唯一的接口。

所以对于上面的那个example模块,是这样定义的:

var x = 5;
var addX = function (value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

好了完事了,模块内部有自己的作用域。在一个模块里面定义的变量、函数、类,都是私有的,对其他文件不可见。这保证了模块内部的干净。

提供了唯一的exports的接口,使得其它客户端可以使用依赖这个模块想为外界提供的功能。

完美的解决了内聚,变量污染和依赖的问题,不服不行,你要知道之前javascript只能出理些小动画之类的,现在,直接解决了这个问题,依赖问题一旦解决,我们就可以用javascript解决大问题了。

相关文章

网友评论

      本文标题:从javascript本没有工厂模式说起

      本文链接:https://www.haomeiwen.com/subject/brplxqtx.html