单例模式的实现方式

这篇博客详细介绍了Echarts中单例模式的应用,通过多个JavaScript示例展示了如何使用单例模式减少代码重复,提高效率。内容包括基本的单例模式实现、全局变量即时调用、惰性函数处理单例模式以及考虑浏览器兼容性的单例模式实现。同时,还探讨了单例模式的改进方法,如原型链继承和构造器修正。
摘要由CSDN通过智能技术生成

用途: 设计模式 在echarts 中表现得淋漓尽致, init 初始化 系统文件, 单例模式,让每一个初始化,都是同一个,减少代码重复;例如:利用惰性函数,处理数据,浏览器兼容!

单例模式实现


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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    设计模式 在echarts 中表现得淋漓尽致, init 初始化 系统文件, 单例模式,让每一个初始化,都是同一个,减少代码重复
    <!--  -->
    <script>
        function Person() {

        }
        let p1 = new Person()
        let p2 = new Person()
        p1 == p2  // 为true  单例模式 特点  提出
    </script>
    <script>
        // 单例 全局模式
        let global;
        function Person() {
            if (global) {
                return global
            }

            this.name = '我是全局模式!'
            global = this;
        }
        let p3 = new Person();
        let p4 = new Person()
        console.log(p3, p4, p3 == p4)
    </script>
    <script>
        // 静态属性
        function Person() {
            if (Person.foctry) {
                return Person.foctry
            }

            this.name = '我是静态属性!'

            Person.foctry = this
        }
        let p5 = new Person();
        let p6 = new Person()
        console.log(p5, p6, p5 == p6, '===')

        Person.foctry = 'demo';
        var p7 = new Person();
        console.log(p5, p7, p5 == p7, '===')
    </script>
    <script>
        // 惰性函数处理 单例模式
        function Person() {
            let global;
            this.name = '我是惰性函数单例模式!'
            global = this;
            Person.prototype.name = '原始';

            // 在这里重新 复制函数地址 (不是原来的 Person 函数了)
            Person = function () {
                return global;
            }
        }
        Person.prototype.des = 'des';  // 第一次初始化的 原型对象
        let p8 = new Person();
        Person.prototype.hi = 'hi';    // 后面指的是 第一次初始化的原型对象  
        let p9 = new Person()
        console.log(p8, p9, p8 == p9, '=====')
    </script>
    <script>
        // 惰性函数的 原型链 继承
        function Person() {
            let global;
            this.name = '我是实例继承,对象!'

            // 3.利用惰性函数更新构造函数(赋值重写,下次利用)
            Person = function () {
                // this = obj2
                // this = obj3
                return global; // 第二次返回内容
            }
            Person.prototype = this  // 原型 继承实例
            global = new Person()
            // 6.修正构造器属性
            global.constructor = Person;
            return global // 第一次初始化,内容
        }
        Person.prototype.des = 'des';  // 因为原型链 被替换 所以des 没有
        let p10 = new Person();
        Person.prototype.hi = 'hi';    // 后面指的是 第一次初始化的原型对象  
        let p11 = new Person()
        console.log(p10, p11, p10 == p11, '=====')
    </script>
    <script>
        // 全局变量 及时调用
        let global1;
        (function () {
            var global1;
            Person = function () {
                if (global1) {
                    return global1;
                }
                this.name = '默认';
                global1 = this;
            }
        })();

        var p12 = new Person();
        var p13 = new Person();
        console.log(p12, p13, p12 == p13); // true

    </script>

    <script>
        // 兼容性
        var addEvent = (function () {
            if (document.addEventListener) {
                return function (type, element, fun) {
                    element.addEventListener(type, fun, false);
                }
            }
            else if (document.attachEvent) {
                return function (type, element, fun) {
                    element.attachEvent('on' + type, fun);
                }
            }
            else {
                return function (type, element, fun) {
                    element['on' + type] = fun;
                }
            }
        })();

        //  new 默认下会 返回这个实例对象,因此函数调用,return;  (代码重写)
        var Person1 = (function () {
            return Person1 = function () {
                if (Person1.foctry) {
                    return Person1.foctry;
                }
                this.name = '默认';
                Person1.foctry = this;
            }
        })()

        var p14 = new Person1();
        var p15 = new Person1();
        console.log(p14, p15, p14 == p15); // true

    </script>
</body>

</html>

单例模式二


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>08-单例模式的实现方式04(惰性函数改进)</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
步骤:
    1.提供一个构造函数
    2.在构造函数内部声明一个私有变量instance
    3.利用惰性函数更新构造函数
    4.设置新构造函数的原型对象是旧构造函数的原型对象
    5.利用新构造函数创建对象并赋值给instance
    6.修正构造器属性
    7.通过instance设置属性或方法
    8.返回instance
<script>
    // 1.提供一个构造函数
    function Person() {
        // this = obj1
        // 2.在构造函数内部声明一个私有变量instance
        var instance;
        // 3.利用惰性函数更新构造函数
        Person = function () {
            // this = obj2
            // this = obj3
            return instance;
        }
        // 4.设置新构造函数的原型对象是旧构造函数的原型对象(原型式继承)
         // 设置新构造函数的原型对象是旧构造函数的一个实例(原型链继承)
        // Stu.prototype = Person.prototype
        // Stu.prototype = new Person();
//        Person.prototype = this.__proto__;
        Person.prototype = this;
        // 5.利用新构造函数创建对象并赋值给instance
        instance = new Person(); // instance = obj2
        // 6.修正构造器属性
        instance.constructor =  Person;
        // 7.通过instance设置属性或方法
        instance.name = '默认';
        // 8.返回instance
        return instance;
    }

    Person.prototype.des = 'des';
    var p1 = new Person(); // obj2
    Person.prototype.hi = 'hi';
    var p2 = new Person(); // obj2
//    console.log(p1 == p2); // true
//    console.log(p1.des); // des
//    console.log(p2.des); // des
//
//    console.log(p1.hi); // hi
//    console.log(p2.hi); // hi

    console.log(p1.constructor == Person); // true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web修理工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值