JavaScript模式 读书笔记四

2019-05-28 11:02:20 浏览数 (1)

第五章 对象创建模式

命名空间模式

通用命名空间函数

代码语言:javascript复制
var MYAPP=MYAPP || {}

MYAPP.namespace=function(ns_string){
  var parts=ns_string.split("."),
  parent=MYAPP,
  i;
  //剥离最前面的冗余全局变量
  if(parts[0]==="MYAPP"){
    parts=parts.slice(1);
  }



  for(i=0;i<parts.length;i =1){
    //如果它不存在,就创建一个属性
    if(typeof parent[parts[i]]==="undefined"){
      parent[parts[i]]={};

   }
   parent=parent[parts[i]];
 }

  return parent;

};

//将返回值非给一个局部变量
var module2=MYAPP.namespace('MYAPP.modules.module2');
module2===MYAPP.modules.module2 //true;

//忽略最前面的MYAPP
MYAPP.namespace("modules.module51");

//长命名空间
MYAPP.namespace("once.upon.a.time.there.was.this.long.nested.property");

声明依赖关系

这是一个及其简单的模式,但同时又很多优点,速度更快

代码语言:javascript复制
var myFunction=function(){
  //依赖
  var event=YAHOO.util.Event,
      dom=YAHOO.util.Dom;

      //使用事件和DOM变量
代码语言:javascript复制
var MYAPP=MYAPP || {}

MYAPP.namespace=function(ns_string){
  var parts=ns_string.split("."),
  parent=MYAPP,
  i;
  //剥离最前面的冗余全局变量
  if(parts[0]==="MYAPP"){
    parts=parts.slice(1);
  }



  for(i=0;i<parts.length;i =1){
    //如果它不存在,就创建一个属性
    if(typeof parent[parts[i]]==="undefined"){
      parent[parts[i]]={};

   }
   parent=parent[parts[i]];
 }

  return parent;

};

var modules=MYAPP.namespace("MYAPP.modules");
modules.m1=function(){
  alert('m1');
}
modules.m2=function(){
  alert("m2");
}
function test(){
  var modules=MYAPP.modules;
  modules.m1();
  modules.m2();

}

私有属性和方法

JavaScript中所有对象的成员都是公共的

代码语言:javascript复制
var myobj={
  myprop:1,
  getProp:function(){
    return this.myprop;
  }
}

console.log(myobj.myprop); //myprop是公有可访问的
console.log(myobj.getProp());  //getProp也是公有可访问的
代码语言:javascript复制
function Gadget(){
  this.name="iPod";
  this.stretch=function(){
    return 'iPod';
  };
}
var toy=new Gadget();
console.log(toy.name); //name 是公有的
console.log(toy.stretch()); //stretch()是公有的

私有成员

可以使用闭包实现私有成员

代码语言:javascript复制
function Gadget(){
  //私有成员
  var name="iPod";

  //公有函数
  this.getName=function(){
    return name;
  };
}
var toy=new Gadget();
console.log(toy.name); //name 是undefined的 ,它是私有的
console.log(toy.getName()); //getName()是公有的 输出iPod

特权方法

Privileged Method ,在上面的例子中,getName()就是一个特权方法,因为它具有访问私有属性的特殊权限。

0 人点赞