Javascript 设计模式 单例(1),2024年最新面试必备金句60条

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文


 <script type="text/javascript">



        /**

         * 单例的用法:

         * 有时候我们需要针对某个页面进行写Js,比如登录页面,建议使用下列方式:

         * ZhangHongyang,singlePageJsForRegiste =

         * {

         *     CONSTANT1:"",

         *     CONSTANT2:"",

         *     f1:function(){},

         *     f2:function(){}

         * }

         */



        ZhangHongYang.singlePageJsForRegister =

        {

            ID_FROM: "registerForm",

            ID_RESULT_CONTAINER: "registerResult",

            init: function ()

            {

                ZhangHongYang.singlePageJsForRegister.form = $("#" + this.ID_FROM);

                ZhangHongYang.singlePageJsForRegister.result = $("#" + ZhangHongYang.singlePageJsForRegister.ID_RESULT_CONTAINER);

                this.form.submit(this.handleSubmit);

            },

            handleSubmit: function (event)

            {



                var datas = {};

                ZhangHongYang.singlePageJsForRegister.form.find("input").each(function (i)

                {

                    //omitted the unnecessary datas

                    if (!($(this).attr("type") == "button" || $(this).attr("type") == "submit" || $(this).attr("type") == "reset" ))

                    {

                        datas[$(this).attr("name")] = $(this).val();

                    }

                });

                ZhangHongYang.singlePageJsForRegister.ajaxSubmit(datas);

                //prevent the default form submit

                event.preventDefault();

            },

            ajaxSubmit: function (datas)

            {

                var url = ZhangHongYang.singlePageJsForRegister.form.attr("action");

                console.log("url :" + url);

                //make ajax submit here

                //$.post(url,datas,function(data){});

                //show result

                ZhangHongYang.singlePageJsForRegister.showResult(datas);

            },

            showResult: function (datas)

            {

                var result = "";

                for (var p in datas)

                {

                    result += p + " = " + datas[p] + "<br/>";

                }

                ZhangHongYang.singlePageJsForRegister.result.html(result);

            }

        };



        $(function ()

        {

            ZhangHongYang.singlePageJsForRegister.init();

        });





    </script>

我们使用单例定义了一个singlePageJsForRegister方法对象,然后将需要用到的元素的Id作为了常量,然后通过init初始化事件等,还有其他的几个函数,代码中也书写了注释。看了上面的代码可能觉得这么写好复杂,代码量也多了,但是对于Js的提升,要慢慢的学习面向对象以及结构化的写法,不能在script标签中,不断的定义各种方法,甚至在html标签中书写onclick这类的属性。Js一定要保证,html与js文件解耦;js代码整体上结构清晰;学习使用面向对象的方式处理问题。

4、如何在单例创建的对象中,定义私有方法和属性

上述单例的写法,会把所有的方法与变量暴露给使用者, 如何设置私有变量或者私有方法。

a、采用约定的方式:所有以_开头的方法和变量都是私有变量。


  /**

         * 方式一

         * 采用约定,所有以_开头的变量或者方法为私有变量

         */

        var singleTon = {

            _m1: "hello",

            _f1: function ()

            {

            },

            init: function ()

            {

            }

        };

可以觉得方式1不是自己骗自己么,但是项目嘛,约定由于配置,也是可行的。实在觉得不能忍受,看方式二:


 /**

         * 方式二

         */

        var singleTon = (function ()

        {

            var _m1 = "hello";

            var _f1 = function ()

            {

                console.log(" i am a private function !");

            }



            return {

                //public method

                init: function ()

                {

                    //invoke the private method in the singleTon

                    _f1();

                }

            };



        })();



采用了闭包的方式,很好的实现了私有变量和私有方法的隐藏。

5、单例实例:解决Textarea的数据存储时的Html转Txt和展示时Txt转Html

在web项目中,很多情况会使用到Textarea。

a、比如留言、技能的书写等;对于这类Textarea我们有必要对用户输入的html代码做特殊处理,防止用户填写恶意代码或者把页面的样式弄乱。

b、相反来说,在Textarea中书写的换行以及空格,最终在div中显示却没有效果,都是一个空格,所有很多web开发者会选择使用只读textarea来回显用户输入内容,其实需要做一定的转换。

html:


<body>

<textarea style="width: 400px;height: 120px;" id="taContent">

</textarea>



<input type="button" id="convert" value="Convert"/>

<br/>

<br/>





<fieldset style="width: 400px">

    <legend>html转化为Txt,供Div展示</legend>

<div style="width: 400px;height: 120px;border: 1px solid #555;" id="divContent">



</div>

</fieldset>



<br/>

<br/>



<fieldset style="width: 400px">

    <legend>Txt转化为Html,供Textarea修改</legend>

    <textarea style="width: 400px;height: 120px;" id="taEdit">

    </textarea>

</fieldset>



</body>

第一个Textarea用于用户输入,然后经过转义显示到div中,然后将转义后的数据进行逆向恢复显示到第二个TextArea中。相当与模拟了,div中展示数据和用户再次编辑数据,这些功能在项目中都相当实用。

我们的js代码:


  /**

         * 对用户在TextArea中输入的数据进行过滤,把< -> <等操作,以及逆向操作

         */

        ZhangHongYang.htmlFilter = (function ()

        {

            /**

             * 转化textarea中的空格为$nbsp;

             * \n转化为<br/>

             * @private

             */

            function _transSpace(data)

            {

                return data.replace(/\n/g, "<br/>").replace(/\s/g, " ");

            };



            /**

             * 转化所有尖括号

             * @private

             */

            function _transBrace(data)

            {

                return data.replace(/</g, "<").replace(/>/g, ">");

            };





            function _resumeSpace(data)

            {

                return data.replace(/ /g, " ").replace(/<br\s*\/>/ig, "\n");

            };

            function _resumeBrace(data)

            {

                return data.replace(/</g, "<").replace(/>/g, ">");

            };



            return {



                txt2Html: function (data)

                {

                    return _transSpace(_transBrace(data));



                }, html2Txt: function (data)

                {

                    return _resumeSpace(_resumeBrace(data));

                }

            };



        })();

在我的命名空间下定义了htmlFilter方法,然后最后暴露两个方法Html2Txt和Txt2Html给使用者。

调用的代码:


    <script type="text/javascript">

        $(function ()

        {

            $("#convert").click(function ()

            {

                var txt = ZhangHongYang.htmlFilter.txt2Html($("#taContent").val());

                console.log(txt);

                $("#divContent").html(txt);

                $("#taEdit").val(ZhangHongYang.htmlFilter.html2Txt(txt));

            });

        });

    </script>

效果图:

可以看到换行、空格、以及恶意的HTML代码等都得到了很好的在DIV中的显示;且最终可还原为Textarea中供编辑;如果各位项目中没有考虑到这类问题,首先你可以测试下问题,然后可以使用上面的代码解决这类问题。

6、单例写法提高多分支代码效率

相信大家都了解过ajax,对象ajax肯定离不开XMLHttpRequest,而且不同版本、类型的浏览器创建方式不一致。一般我们可能会这么写创建XMLHttpRequest的方法:


  function createXhr()

        {

            var xmlhttp;

            if (window.XMLHttpRequest)

            {// code for IE7+, Firefox, Chrome, Opera, Safari

                xmlhttp=new XMLHttpRequest();

            }

            else

            {// code for IE6, IE5

                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

            }



            return xmlhttp ;

        }

存在一个问题,每次创建XHR对象都需要进行分支判断,如果某个方法分支特别多,我们可以做进一步的优化,当浏览器加载js文件时,就决定以后调用只会用其中合适的方式,而不会走分支。

我们把代码改成:


   /**

         * 用于在程序加载次js文件时,根据当前浏览器返回一个创建xhr的工厂方法,而不需要每次都去分支判断

         */

        ZhangHongYang.xhrFactroy = (function ()

        {

            function _ieCreateXhr()

            {     // code for IE6, IE5


#### react和vue的比较

相同
1)vitual dom
2)组件化
3)props,单一数据流

不同点
1)react是jsx和模板;(jsx可以进行更多的js逻辑和操作)
2)状态管理(react)
3)对象属性(vue)
4)vue:view——medol之间双向绑定
5)vue:组件之间的通信(props,callback,emit)



![](https://img-blog.csdnimg.cn/img_convert/fceab1dae17b4f8aafd3174582d85b5a.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/d84725d67a05e9dcb53bfe840595ee29.webp?x-oss-process=image/format,png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
![img](https://img-blog.csdnimg.cn/img_convert/3a182bd9c633a9cfca5c1eede48f7ffb.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
n _ieCreateXhr()

            {     // code for IE6, IE5


#### react和vue的比较

相同
1)vitual dom
2)组件化
3)props,单一数据流

不同点
1)react是jsx和模板;(jsx可以进行更多的js逻辑和操作)
2)状态管理(react)
3)对象属性(vue)
4)vue:view——medol之间双向绑定
5)vue:组件之间的通信(props,callback,emit)



[外链图片转存中...(img-Z2rw1vjr-1713308256123)]

[外链图片转存中...(img-LgGtuau7-1713308256124)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中...(img-26SCHnP1-1713308256124)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值