《JavaScript高级程序设计 (第3版)》学习笔记29:chapter_7 - 4 私有变量之模块模式和增强的模块模式

让学习“上瘾”,成为更好的自己!!!

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>模块模式和增强的模块模式</title>
</head>

<body>


    <script>
        // 1 , 模块模式
        /*
    前面两种模式是用于为自定义类型创建私有变量和特权方法的
    模块模式  -->  为单例创建私有变量和特权方法
    单例:只有一个实例的对象(若创建构造函数,则程序中只有一个该构造函数的实例), JavaScript用对象字面量的方式来创建单例对象
   
    var
    
    
    */
        // 单例对象
        var singleton = {
            name: value,
            method: function () {
                // do something
            }
        };

        // 模块模式通过为单例添加私有变量和特权方法能够使单例得到增强
        // 语法如下:
        var singleton = function () {

            // 私有变量和私有函数
            var privateValue = 10;

            function privateFunction() {
                return false;
            }

            // 公有方法
            // 返回的对象是在匿名函数内部定义的,因此他的公有方法有权访问私有变量和函数
            // 本质上讲,这个对象字面量定义的是单例的公共接口!
            return {
                publicProperty: true,
                publicMethod: function () {
                    privateValue++;
                    return privateFunction();
                }
            };


        }();

        // 模块模式在需要对单例进行某些初始化,同时又要维护其私有变量时非常有用
        // 如下:
        var application = function () {
            // 私有变量和私有函数
            var components = new Array();

            // 初始化
            components.push(new BaseComponent());

            return {
                getComponentCount: function () {
                    return components.length;
                },

                registerComponent: function (component) {
                    if (typeof component === 'object') {
                        components.push(component);

                    }

                }
            };



        }();
        // 简言之,如果必须创建一个对象并以某些数据对其进行初始化,同时还要公开一些能够访问这些私有数据的方法,那么就可以用“模块模式”
        // 以这种模式创建的每一个单例都是Object的实例, 而且单例通常都是作为全局对象而存在的



        // 2, 增强的模块模式
        // 进一步改造:在返回对象之前加入对其增强的代码
        // 增强的模块模式 --> 适合那些单例必须是某种类型的实例,同时还必须添加某些属性和方法对其加以增强的情况
        var singleton = function () {

            // 私有变量和私有函数
            var privateValue = 10;

            function privateFunction() {
                return false;
            }

            // 创建对象
            var object = new CustomType();
            
            // 添加特权属性和方法
            object.publicProperty = 10;
            object.publicMethod = function(){
                privateValue++;
                return privateFunction();
            };

            // 返回这个对象
            return object;

        }();


        // 如果前面演示的模块模式的例子中的application对象必须是BaseComponent的实例,则:
        var application = function () {
            // 私有变量和私有函数
            var components = new Array();

            // 初始化
            components.push(new BaseComponent());

            // 构建一个application的一个局部副本
            var app = new BaseComponent();

            // 公共接口
            app.getComponentCount = function(){
                return components.length;
            };

            app.registerComponent = function(){
                if (typeof component === 'object') {
                        components.push(component);

                    }
            };

            // 返回这个副本
            return app;

        }();


    // 可以使用构造函数模式、原型模式来实现自定义类型的特权方法
    // 也可以使用模块模式、增强的模块模式来实现单例的特权方法
   

    </script>


</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值