另一个利用模块模式的做法是在返回对象之前先对其进行增强。这适合单例对象需要是某个特定类
型的实例,但又必须给它添加额外属性或方法的场景。来看下面的例子:
let singleton = function() {
// 私有变量和私有函数
let privateVariable = 10;
function privateFunction() {
return false;
}
// 创建对象
let object = new CustomType();
// 添加特权/公有属性和方法
object.publicProperty = true;
object.publicMethod = function() {
privateVariable++;
return privateFunction();
};
// 返回对象
return object;
}();
如果前一节的application 对象必须是BaseComponent 的实例,那么就可以使用下面的代码来
创建它:
let application = function() {
// 私有变量和私有函数
let components = new Array();
// 初始化
components.push(new BaseComponent());
// 创建局部变量保存实例
let app = new BaseComponent();
// 公共接口
app.getComponentCount = function() {
return components.length;
};
app.registerComponent = function(component) {
if (typeof component == “object”) {
components.push(component);
}
};
// 返回实例
return app;
}();
在这个重写的application 单例对象的例子中,首先定义了私有变量和私有函数,跟之前例子中
一样。主要区别在于这里创建了一个名为app 的变量,其中保存了BaseComponent 组件的实例。这是
最终要变成application 的那个对象的局部版本。在给这个局部变量app 添加了能够访问私有变量的
公共方法之后,匿名函数返回了这个对象。然后,这个对象被赋值给application。
小结
函数是JavaScript 编程中最有用也最通用的工具。ECMAScript 6 新增了更加强大的语法特性,从而
让开发者可以更有效地使用函数。
函数表达式与函数声明是不一样的。函数声明要求写出函数名称,而函数表达式并不需要。没
有名称的函数表达式也被称为匿名函数。
ES6 新增了类似于函数表达式的箭头函数语法,但两者也有一些重要区别。
JavaScript 中函数定义与调用时的参数极其灵活。arguments 对象,以及ES6 新增的扩展操作符,
可以实现函数定义和调用的完全动态化。
函数内部也暴露了很多对象和引用,涵盖了函数被谁调用、使用什么调用,以及调用时传入了
什么参数等信息。
JavaScript 引擎可以优化符合尾调用条件的函数,以节省栈空间。
闭包的作用域链中包含自己的一个变量对象,然后是包含函数的变量对象,直到全局上下文的
变量对象。
通常,函数作用域及其中的所有变量在函数执行完毕后都会被销毁。
闭包在被函数返回之后,其作用域会一直保存在内存中,直到闭包被销毁。
函数可以在创建之后立即调用,执行其中代码之后却不留下对函数的引用。
立即调用的函数表达式如果不在包含作用域中将返回值赋给一个变量,则其包含的所有变量都
会被销毁。
虽然JavaScript 没有私有对象属性的概念,但可以使用闭包实现公共方法,访问位于包含作用域
中定义的变量。
可以访问私有变量的公共方法叫作特权方法。
特权方法可以使用构造函数或原型模式通过自定义类型中实现,也可以使用模块模式或模块增
强模式在单例对象上实现。
javascript基础学习系列四百九十二:模块增强模式
最新推荐文章于 2024-10-08 13:51:35 发布