js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计

说在前面:这是我近期开发或者看书遇到的一些点,觉得还是蛮重要的。

一、为你的 JavaScript 对象提供命名空间

<!DOCTYPE html>
<html>
<head>
    <title>为自己的js对象提供命名空间</title>
</head>
<body>
<div>封装自己的数据和函数,防止和其他的库搞混了</div>
<script>
    var jscbObject = {

  // return element
  getElem : function (identifier) {
    return document.getElementById(identifier);
  },

  stripslashes : function(str) {
    return str.replace(/\\/g, ‘‘);
  },

  removeAngleBrackets: function(str) {
    return str.replace(/</g,‘&lt;‘).replace(/>/g,‘&gt;‘);
  }
};

var sample = "<div>testing\changes</div>";

var result = jscbObject.stripslashes(sample);
result = jscbObject.removeAngleBrackets(result);

console.log(result); //&lt;div&gt;testingchanges&lt;/div&gt;

</script>
</body>
</html>

以上例子, jscbObject 提供了不同的命名空间,封装了函数 getElem() 、stripslashes() 、removeAngleBrackets(),防止和其他库的函数重名。其实很简单,很多人也写过类似的代码,但是不知道这种方式的含义。即使会写,面试的时候,不一定能答得出来“什么是命名空间?”。

二、单体模式

这个问题在C++、JAVA的面试题中都出现过。

好处:

1.可以用它来划分命名空间。

2.利用分支技术来封装浏览器之间的差异。

3.借助单体模式,可以把代码组织的更为一致,方便阅读与维护。

方法一:使用闭包

<!DOCTYPE html>
<html>
<head>
    <title>什么是单例模式</title>
</head>
<body>
<script>
    var mySingleton = (function () {

  // Instance stores a reference to the Singleton  // 返回对象的引用
  var instance;

  function init() {//创建实例的构造函数

    // Singleton

    // Private methods and variables
    function privateMethod(){
        console.log( "I am private" );
    }

    var privateVariable = "Im also private";

    var privateRandomNumber = Math.random();

    return {

      // Public methods and variables
      publicMethod: function () {
        console.log( "The public can see me!" );
      },

      publicProperty: "I am also public",

      getRandomNumber: function() {
        return privateRandomNumber;
      }

    };

  };

  return {

    // Get the Singleton instance if one exists
    // or create one if it doesn‘t  // 静态方法获得实例
    getInstance: function () {

      if ( !instance ) {
        instance = init();
      }

      return instance;
    }

  };

})();

singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); //true
</script>
</body>
</html>

在该函数中使用var和function关键字分别来定义其私有属性和方法,这些在函数外部(单体对象外部)是无法直接访问的,因为函数一执行完毕,其内部作用域的空间就会被回收,这也就是能够利用闭包来模拟私有属性和方法的原因所在。在该函数(闭包)中,同时最终返回一个对象,这个对象中包含一些公有方法和属性,在外部可以直接调用,同时这些公有方法由于定义在函数内部,所以可以调用其私有属性和方法,但是外界只能通过返回的公有方法和属性来完成某些操作,不能够直接调用Singleton.privateMethod 和 Singleton.privateVariable 这些属性。这就使得该单体对象既隔离了外界去直接访问其私有属性和方法,又提供给外界一些共有属性和方法去完成某些操作。

js载入的时候就创建了这个对象。在单体模式中,针对一个对象只能创建一个实例。单体可以在一个特定的时间实例化,而不是作为一个解决方案中所定义的一个静态的构造而存在。上面示例中的单体使用一个立即调用的函数表达式(IIFE)将对象包装起来,IIFE会立即返回对象的一个实例。但是,不只是任何的实例,如果已经存在一个实例,它不会返回一个新的实例。这个特性在后续代码中得到了展示:

singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log( singleA.getRandomNumber() === singleB.getRandomNumber() ); //true

它返回了当时创建对象时候所生成的一个随机数,并且不管访问哪一个“实例”,都会返回相同的随机数。

 方法二:对象字面量

var Singleton={
    name: nimei,
    age: 2,
    walk: function(){
        ...
    },
    eat: function(){
        ...
    }
}

这个单体对象的所有属性和方法都是共有的,外部可随时访问和修改。

三、js变量的深拷贝与浅拷贝

JS中的数据类型有:字符串、数字、布尔、数组、对象、Null、Undefined(Undefined 这个值表示变量不含有值,可以通过将变量的值设置为 null 来清空变量)。

对于字符串类型、数字、布尔的浅复制是对值的复制。对于数组和对象来说,浅复制是对对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变。而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

<!DOCTYPE html>
<html>
<head>
    <title>浅拷贝与深拷贝</title>
</head>
<body>
<script>

    var str1 = "Nice to meet you!";
    var str2 = str1;
    str2 = ‘He is called "Bill"‘;
    console.log(" str1  " + str1 +"  str2  " + str2); // str1  Nice to meet you!  str2  He is called "Bill"

    var num1 = 1;
    var num2 = num1;
    num2 = 3;
    console.log(‘ num1  ‘ + num1 +"  num2  " + num2); // num1  1  num2  3

    var bool1 = true;
    var bool2 = bool1;
    bool2 = false;
    console.log(‘ bool1  ‘ +bool1 + "  bool2  " + bool2); // bool1  true  bool2  false

    var arr1 = [‘one‘ , ‘two‘ , ‘three‘];
    var arr2 = arr1;
    arr2[1] = ‘change‘;
    console.log(‘ arr1  ‘ + arr1 + "  arr2 " +arr2); // arr1  one,change,three  arr2 one,change,three  

    var obj1 = {
        firstname : "Bill",
        lastname  : "Gates",
        id        :  5566
        };
    var obj2 = obj1;
    obj2.firstname = ‘Bob‘;
    console.log(‘ obj1.firstname  ‘ + obj1.firstname + "  obj2.firstname  " + obj2.firstname); // obj1.firstname  Bob  obj2.firstname  Bob
</script>
</body>
</html>

由以上示例可知,对于数据类型 “字符串、数字、布尔”,直接浅拷贝即可复制。对于数据类型“ 数组、对象”,若要复制变量的值,只能深拷贝。

网上找到一个很好的深拷贝方法:

<!DOCTYPE html>
<html>
<head>
    <title>浅拷贝与深拷贝</title>
</head>
<body>
<script>

    var cloneObj = function(obj){
    var str, newobj = obj.constructor === Array ? [] : {};
    if(typeof obj !== ‘object‘){
        return;
    } else if(window.JSON){
        str = JSON.stringify(obj), //系列化对象
        newobj = JSON.parse(str); //还原
    } else {
        for(var i in obj){
            newobj[i] = typeof obj[i] === ‘object‘ ?
            cloneObj(obj[i]) : obj[i];
        }
    }
    return newobj;
};

    var arr1 = [‘one‘ , ‘two‘ , ‘three‘];
    var arr2 = cloneObj(arr1);
    arr2[1] = ‘change‘;
    console.log(‘ arr1  ‘ + arr1 + "  arr2 " +arr2); // arr1  one,two,three  arr2 one,change,three

    var obj1 = {
        firstname : "Bill",
        lastname  : "Gates",
        id        :  5566
        };
    var obj2 = cloneObj(obj1);
    obj2.firstname = ‘Bob‘;
    console.log(‘ obj1.firstname  ‘ + obj1.firstname + "  obj2.firstname  " + obj2.firstname); // obj1.firstname  Bill   obj2.firstname  Bob
</script>
</body>
</html>

可是在拷贝有些很复杂的对象的时候,会出现错误:

因为上述cloneObj() 中是用来递归,如果需要复制的 object 对象太大,递归次数太多导致内存被耗费太多,就会出现栈溢出的错误,这时候就得根据对象内容重新重新写clone()函数了。

可参考:http://blog.csdn.net/sysuzhyupeng/article/details/70340598

四、页面弹窗设计

弹窗1:警告框

<!DOCTYPE html>
<html>
<head>
<script>
function myFunction()
{
    alert("你好,我是一个警告框!");//方法一:alert
}
</script>
</head>
<body>

<input type="button" onclick="myFunction()" value="显示警告框">

</body>
</html>

弹窗2:确认框

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p>点击按钮,显示确认框。</p>
<button onclick="myFunction()">点我</button>
<p id="demo"></p>
<script>
function myFunction(){
    var x;
    var r=confirm("按下按钮!");
    if (r==true){
        x="你按下了\"确定\"按钮!";
    }
    else{
        x="你按下了\"取消\"按钮!";
    }
    document.getElementById("demo").innerHTML=x;
}
</script>

</body>
</html>

弹窗3:提示框

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p>点击按钮查看输入的对话框。</p>
<button onclick="myFunction()">点我</button>
<p id="demo"></p>
<script>
function myFunction(){
    var x;
    var person=prompt("请输入你的名字","Harry Potter");
    if (person!=null && person!=""){
        x="你好 " + person + "! 今天感觉如何?";
        document.getElementById("demo").innerHTML=x;
    }
}
</script>
</body>
</html>

弹窗4:模拟百度登录页面的弹窗

<!DOCTYPE html>
<html>
<head>
    <title>浅拷贝与深拷贝</title>
    <style type="text/css">
    #mask {
        position:fixed;
        width: 100%;
        height: 100%;
        background-color: rgba(0,0,0,0.5);
        display: none;
        color: #888;
}
    #win{
        display:none;
        width: 300px;
        height: 700px;
        left: 35%;
        position: absolute;
        overflow: auto;
        background-color: #111;
        color: #888;
}
    </style>
</head>
<body height = 100%>
<div id="mask"></div>
<div id="win">
    <p>弹出窗口,父页面不可点击,只能操作弹出的页面,类似于百度的登录界面。可在弹出框页面加入表单、按钮等任何组件。</p>
    <button onclick = "closeWin()">隐藏</button>
</div>
<button onclick = "openWin()">弹出</button>

<script>
            function openWin(){
                document.getElementById("mask").style.display = "block";
                document.getElementById("win").style.display = "block"
            }
            function closeWin(){
                document.getElementById("mask").style.display = "none";
                document.getElementById("win").style.display = "none"
            }

</script>
</body>
</html>

弹窗5:模拟客户端的可移动的功能弹窗

<!DOCTYPE html>
<html>
<head>
    <title>浅拷贝与深拷贝</title>
    <style type="text/css">
    #mask {
        position:fixed;
        height: 100%;
        background-color: rgba(0,0,0,0.5);
        display: none;
        color: #888;
}
    #win{
        display:none;
        width: 300px;
        height: 700px;
        left: 35%;
        position: absolute;
        overflow: auto;
        background-color: #111;
        color: #888;
}
    </style>
    <script type="text/javascript" src="jquery-3.2.1.js"></script>
    <script type="text/javascript" src="jquery-ui.min.js"></script>
</head>
<body height = 100%>
<div id="mask"></div>
<div id="win">
    <p>弹出窗口,父页面可点击,可同时操作父页面和弹出页面。可在弹出框页面加入表单、按钮等任何组件。</p>
    <button onclick = "closeWin()">隐藏</button>
</div>
<button onclick = "openWin()">弹出</button>

<script>
            function openWin(){
                document.getElementById("mask").style.display = "block";
                document.getElementById("win").style.display = "block"
            }
            function closeWin(){
                document.getElementById("mask").style.display = "none";
                document.getElementById("win").style.display = "none"
            }
            $(function() {
                $( "#win" ).draggable();
              });
</script>
</body>
</html>

差不多是这样子

希望能帮到别人,喜欢就麻烦点个赞鼓励鼓励哈^_^

时间: 2024-07-30 10:13:29

js的命名空间 && 单体模式 && 变量深拷贝和浅拷贝 && 页面弹窗设计的相关文章

JS 单体模式

<!-- ————————JS设计模式 单体模式——————— --> //1.简单单体模式 var Singleton={ attr1:true, attr2:10, method1:function(){ alert("方法一"); }, method2:function(){ alert("方法二"); } }; //单体模式 划分命名空间(区分代码) var XL={};//创建自己的命名空间 XL.Singleton2={ attr1:true

如何做JS 单体模式的设计----&gt;&gt;js设计模式&lt;&lt;-------单体模式

1. 单体模式是js中最基本 单最有用的模式之一,非常常用. 单体模式的基本结构如下: var Person = { name: 'lilu', age:'20', sayHi: function(){ alert('456456'); }, sayBye: function(){ alert('456456'); } } 这个栗子中,所有的成员都可以通过Person进行访问,用点运算符就行. 如: Person.name = "zczc"; Person.age = "10

JS设计模式—单体模式(即时加载/惰性加载)

单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对象语言虽然在单体模式的思想上是一致的,但是实现起来还是有差异的. 首先来看看传统面向对象语言对于单体模式的定义:单体模式是只能被实例化一次并且可以通过一个众所周知的访问点来访问的类.这个定义有两点突出了传统面向对象语言的特征,即类和实例化,所以对于传统面向对象语言来讲,单体模式是建立在其类和实例化的

js设计模式--单体模式

单体模式 -单体模式(singleton)是javaScript中最基本最有用的设计模式之一. -这种模式提供了一种将代码组织为一个逻辑单元的手段,这个逻辑单元中的代码可以通过单一 的变量进行访问.通过确保单体对象只存在一份实例,你就可以确信自己的所有代码使用的都是 同样的全局资源. -简单单体 -闭包单体 -惰性单体 -分支单体 <script type="text/javascript" charset="utf-8"> // 单体模式(single

进阶前端高级攻城狮:使用单体模式设计原生js插件

----------基于上次写的jquery插件进行改造  http://www.cnblogs.com/GerryOfZhong/p/5533773.html 背景:jQuery插件依赖jQuery库,虽然jQuery使用十分广泛,但是对于移动开发或者在其他带宽需求需要注意的时候,就得考虑,因为我不可能完成一项技术相对来说引用了一个更大的库,这样之不值得的.所以原生js是所有浏览器都支持的一种语言,原生js相对来说就very good了,但是原生js相对新手或者没有很强基础的人来说还是相对比较

JavaScript设计模式——单体模式

一:单体模式简介: 是什么:将代码组织为一个逻辑单元,这个单元中的代码通过单一的变量进行访问.只要单体对象存在一份实例,就可以确信自己的所有代码使用的是同样的全局资源. 用途:1.用来划分命名空间,减少网页中全局变量的数目. 2.在分支技术中用来封装浏览器之间的差异. 3.单体对象创建的命名空间可以快速清除全局变量. 4.增强模块性 关于单体模式的好坏,等你看完所有的讲解之后再告诉你哦....... 二:单体结构: 1.最简单的单体就是一个对象字面量. 1 var ProductTools={

javascript --- 设计模式之单体模式

单体是一个用来划分命名空间并将一些相关的属性与方法组织在一起的对象,如果她可以被实例化的话,那她只能被实例化一次(她只能嫁一次,不能二婚). 单体模式是javascript里面最基本但也是最有用的模式之一. 特点:1. 可以用来划分命名空间,从而清除全局变量所带来的危险或影响. 2. 利用分支技术来来封装浏览器之间的差异.   3. 可以把代码组织的更为一体,便于阅读和维护. 单体模式的基本写法: /* 最基本的单体模式 */ var her = { name: 'Anna', sex: 'wo

javascript中单体模式的实现

单体模式作为一种软件开发模式在众多面向对象语言中得到了广泛的使用,在javascript中,单体模式也是使用非常广泛的,但是由于javascript语言拥有其独特的面向对象方式,导致其和一些传统面向对象语言虽然在单体模式的思想上是一致的,但是实现起来还是有差异的. 首先来看看传统面向对象语言对于单体模式的定义:单体模式是只能被实例化一次并且可以通过一个众所周知的访问点来访问的类.这个定义有两点突出了传统面向对象语言的特征,即类和实例化,所以对于传统面向对象语言来讲,单体模式是建立在其类和实例化的

JavaScript中的单体模式四种实现方式

1 /* 2 1 简单单体 3 */ 4 var Singleton = { 5 attr1: 1 , 6 method1:function(){ 7 //do sth 8 } 9 }; 10 alert(Singleton.attr1); 11 Singleton.method1(); 12 13 //单体模式一般用于划分命名空间 也就是区分是哪位开发人员的代码 例如 14 //张三工程师开发的代码 15 var Zhangsan = { }; 16 //把张三的逻辑写在这里面 17 Zhan