ECMAScriptjs 设计情势

var nameSpace={
  a:"jack",
  b:function(){}
};
<button id="btn">click</button>
<script>
 var creatediv=(function(){
 var div;
 return function(){
    if(!div){
    div=document.createElement("div");
    div.style.width="200px";
    div.style.height="200px";
    div.style.border="1px solid red";
    div.style.display="none";
    document.body.appendChild(div);
    }
    return div;
 }
 })();
 document.getElementById("btn").onclick=function(){

 var show=creatediv();
    show.style.display="block";
 };
</script>

  大家能够使用即时执行函数,来模拟块级效率域,把变量封装在闭包的里边,只揭发一些接口跟外界通讯:

  惰性单例:是指只在必要的时候才创设对象的实例。相比较实用。

  动态类型语言的变量类型要到程序运维时,待变量赋值后,才能明确某连串型,而JavaScript就是一门典型的动态类型语言。

原型继承:

 

  下面创制三个”空“对象,利用了ECMAScript5的Object.getPrototypeOf格局查看到了贰个对象的原型。那里的”空“加引号不是确实的空对象,它还接二连三了Object的部分性质及艺术。创制1个空对象使用Object.create()即可:

<button id="btn">click</button> 

var demo=(function(){
    var name="jack",age=18;

 return {
    getInfo:function(){    
        return name+"-"+age;    
    }     
 }
 })();
 alert(demo.getInfo());//jack-18
var t={};// 以字面量方式创建的空对象就相当于:var t= Object.create(Object.prototype);
var s=new Object();
alert(Object.getPrototypeOf(t)===Object.prototype);//true
alert(Object.getPrototypeOf(s)===Object.prototype);//true

一 、使用命名空间

  原型方式是用以创制对象的一种情势,可因而仿制来创设三个指标,最新的ECMAScript5提供了Object.create
方法来克隆对象:

② 、使用闭包来封装私有变量

以下三种艺术能够相对下降全局变量带来的命名污染:

上边是1个惰性单例的例证:

 二 、单例情势

  单例格局定义:保险三个类唯有1个实例,并提供三个拜访它的大局访问点。

待续

  不过在js中并无“类”这一说,单例形式的基本是确定保证唯有叁个实例,并提供全局访问。大家平常会把全局变量当成单例来利用,例如那样的款式:

  那里大家将a和b作为nameSpace的习性,那样能够削减变量和全局功能域相会的机遇。别的大家还足以动态的始建命名空间。

 var d={};
var A=function(){};
A.prototype.sayName=function(){alert("hi");}

var B=function(){};
B.prototype=new A();//这是核心代码:它重写了B的原型,它和把B.prototype直接赋值给字面量对象相比没有本质区别,
                    //都是将对象构造器的原型指向另一个对象,而继承总是发生在对象与对象之间。
var b=new B();
b.sayName();//hi 

叁 、策略形式

  不过如此使用全局变量会很简单造成命名空间的传染。大家有必要尽量裁减全局变量的选用,将污染降低到最低截至。

① 、原型形式

<script>
var fruit={price:15,name:"apple"}
var demo=Object.create(fruit);
alert(demo.name);//apple

//或者:
function sch(){
  this.name="hube";
  this.age=100;
}
var tt=new sch(); 
var t=Object.create(tt);
  alert(t.age);//100


//在不支持的该方法的浏览器中,则可以使用如下polyfill代码:
Object.create=function(obj){
  var F=function(){};//定义了一个隐式的构造函数
  F.prototype=obj;
  return new F();  //还是通过new来实现的
}
</script>

  首先大家须要掌握JavaScript与历史观的面向对象编制程序(oop)不相同,它并未守旧意义上的类,该语言的一切都以基于对象,依靠的是一套原型(prototype)系统。JavaScript通过原型委托的艺术完成指标与对象时期的继续,而不是观念面向对象语言中的类式继承。

  实际上通过对目标构造器的原型动态赋值给别的对象来促成”类“与”类“之间的原型继承:

四 、代理形式

  最简便易行的不二法门是选取对象字面量的样式:

  该情势不幸免此,它越来越多的是提供了一种方便人民群众的点子去创设有个别项目标靶子。

var o = Object.create(null);//创建一个原型为null的空对象

`**Object.create()`方式会动用钦点的原型对象及其性质去创制1个新的目标。事实上JavaScript有二个根对象的存在,它正是Object.prototype**对象,Object.prototype是1个空对象,大家创立的每3个对象都是从Object.prototype克隆而来: