当前位置: 首页 > 编程日记 > 正文

JavaScript模式读书笔记 第5章 对象创建模式

1,命名空间模式  namespace
  <script>
var myApp = {};//通过全局变量来实现命名空间
maApp.Parent = function (){
 
};
myApp.Child = function(){
};
  </script>

    通用命名空间函数
  <script>
//不安全代码
var myApp = {};
//安全代码
if(typeof myApp === "undefined"){
var myApp = {};
}
//或者使用更短的语句
var myApp = myApp || {};
  </script>
使用命名空间函数

  <script>
myApp.namespace("myApp.modules.module2");
//等同于如下代码
var myApp = {
modules : {
module2:{}
}
};
  </script>

<script>
var myApp = myApp || {};
 
myApp.namespace = function(ns_string){
 
var parts = ns_string.split('.'), parent = myApp, i;
 
if(parent[0] === "myApp"){
parts = parts.slice(1);
}
 
for(i = 0; i < parts.length; i++){
if(typeof parent[parts[i]] === "undefined"){
parent = parent[parts[i]];
}
}
return parent;
};
 
var modules2 = myApp.namespace("myApp.modules.module2");
console.log(modules2 === myApp.modules.module2);
 
myApp.namespace("modules.module2");
  </script>

2,声明依赖关系
    js库通常是模块化且依据命名空间组织的。
  var myFunction = function(){ var event = YAHOO.util.event, dom = YAHOO.util.Dom; }

3,私有属性和方法
    JS并没有特殊的语法来表示私有。JS中所有对象的成员是公共的。
    
var myObj = {
  
myProp : 1,
   getPro: function(){
 
return this.myProp;
  }
 
};
console.log(myObj.myProp);
console.log(myObj.getPro());
    但是可以使用闭包实现成员私有化。
   
  <script>
function Gadget(){
//私有成员
var name = "iPoid";
//共有函数
this.getName = function(){
return name;
};
}
 
var toy = new Gadget();
 
console.log(toy.name);//undefined
console.log(toy.getName);//iPoid 
  </script>
私有性失效:因为涉及到引用传值,如果传递私有属性给外部,则外部可直接访问私有属性,如下:
   
 <script>
function Gadget(){
//私有成员
var specs = {
screen_width: 320,
screen_hight: 650,
color: 'RED'
};
//共有函数
this.getSpecs = function(){
return specs;
};
}
 
var toy = new Gadget(),
specs = toy.getSpecs();
specs.color = "GUESS";
console.log(specs.screen_width);//320
console.log(specs.color);//GUESS
 
console.dir(toy.getSpecs());
 
  </script>
4,对象字面量以及私有属性
  
    <script>
var myObj = (function(){
var name = "name";
 
return {
getName: function(){
return name;
}
};
}());
console.log(myObj.getName());//name
  </script>
5,原型和私有性
    通过prototype可以动态的给对象添加属性和方法。
   
  <script>
function Gadget(){
var name = "Ipod";
 
this.getName = function(){
return name;
};
}
 
Gadget.prototype = (function(){
var browser = "others";
 
return{
getBrowser: function(){
return browser;
}
};
}());
 
var toy = new Gadget();
console.log(toy.getName());//name
console.log(toy.getBrowser());//others
  </script>

6,将私有方法揭示为公共方法
    通过全局变量可以将匿名函数的私有方法公开。
  
  <script>
 var myArray;
 
 (function(){
var astr = "[object Array]",
toString = Object.prototype.toString;
 
function isArray(s){
return toString.call(s) === astr;
}
 
function indexOf(haystack, needle){
var i = 0, 
max = haystack.length;
for(; i < max; i+= 1){
if(haystack[i] === needle){
return i;
}
}
return -1;
}
myArray = {isArray: isArray, 
indexOf: indexOf,
inArray: indexOf};
 
console.log(myArray.isArray([1, 2]));//true
console.log(myArray.isArray({0 : 1}));//false
console.log(myArray.indexOf(["a", "b"], "a"));//0
console.log(myArray.indexOf(["a", "b"], "d"));//-1
 }());
 
console.log(myArray.indexOf(["a", "b"], "a"));//0
console.log(myArray.indexOf(["a", "b"], "d"));//-1
  </script>
7,模块模式
    模块模式通过命名空间,完成函数变量定义和使用。
  
<script>
myApp.namespace("myApp.util.array");
myApp.util.array = (function(){
var uobj = myApp.util.object, 
ulang = myApp.util.lang,
array_string = "[object Array]",
ops = Object.prototype.toString;
return {
inArray: function(needle, haystack){
for(var i = 0, max = haystack.length; i < max; i+= 1){
if(haystack[i] === needle){
return true;
}
}
},
 
isArray: function(s){
return ops.call(a) === array_string;
}
};
 
 
}());
  </script>
通过揭示模式暴漏想暴漏的方法。
<script>
myApp.namespace("myApp.util.array");
myApp.util.array = (function(){
var uobj = myApp.util.object, 
ulang = myApp.util.lang,
array_string = "[object Array]",
ops = Object.prototype.toString;
inArray: function(needle, haystack){
for(var i = 0, max = haystack.length; i < max; i+= 1){
if(haystack[i] === needle){
return true;
}
}
},
 
isArray: function(s){
return ops.call(a) === array_string;
};
 
return {
isArray: isArray,
indexOf: inArray
};
}());
  </script>
创建构造函数的模块
    
 <script>
myApp.namespace("myApp.util.array");
myApp.util.array = (function(){
var uobj = myApp.util.object, 
ulang = myApp.util.lang;
 
Constr;
 
Constr = function(o){
this.elements = this.toArray(o);
};
 
//共有API原型
Constr.prototype = {
constructor: myApp.util.array,
version: "2.0",
toArray: function(obj){
for(var i = 0, a= [], len = obj.length; i < len; i+= 1){
a[i] = obj[i];
}
 
return a;
}
};
 
//返回要分配给新命名空间的构造函数
return Constr;
});
 
var arr = new myApp.util.array([obj]);
  </script>
8,将全局变量导入到模块中
     
<script>
MYAPP.util.module = (function(app, global){
//
}(MYAPP, this));
  </script>
9,沙箱模式
    沙箱模式解决命名空间模式的如下特点:
    -1,对单个全局变量的依赖变成了对应用程序的全局变量依赖。在命名空间模式中,是没有办法使用同一个应用程序或库的两个版本在同一页面中,因为这两者都需要同一个全局符号名。
    -2,对这种以点分割的名字来说,需要输入更长的字符,同时解析时需要更长的时间。如:myapp.a.b.c.d
沙箱模式提供了一个可用于模块运行的环境,且不会对其他模块和沙箱造成影响。
10,全局构造函数
       最基础的使用如下图所示
   <script>
new Sandbox(function(box){
//write your code
});
  </script>
    通过以下两种方式扩展属性:
    -1,在创建对象的时候不实用new操作符。
    -2,Sandbox()狗仔函数可以接受一个额外的配置参数,其中改参数制订了对象事例所需要的模块名。
      
<script>
Sandbox(['ajax', 'event'], function(box){
//your code
});
  </script>
或者,
<script>
Sandbox('ajax', 'event', function(box){
//your code
});
  </script>
一个沙箱中可以继续使用一个沙箱模块。
<script>
Sandbox('dom', 'event', function(box){
//your code 
Sandbox('ajax', function(box){
//your cide 
})
 
//此处无法获取ajax
});
  </script>
11,增加模块
     
<script>
Sandbox.modules = ();
Sandbox.modules.dom = function(box){
box.getElement = function(){};
box.getStyle = function(){};
box.foo = "bar";
};
Sandbox.modules.event = function(box){
//如果需要,可以通过如下语句访问Sandbox原型
//box.constructor.prototype.m = "mmmmm";
 
box.attachEvent = function(){};
box.dettachEvent = function(){};
};
Sandbox.modules.ajax = function(box){
box.makeRequest = function(){};
boix.getResponse = function(){};
}
  </script>
12,实现构造函数
    
<script>
function Sandbox(){
//将参数转为一个数组
var args = Array.prototype.slice.call(arguments), 
  //最后一个参数是回调函数
callback = args.pop(),
//模块可以做为一个数组传递,或作为单独的参数传递
modules = (args[0] && typeof args[0] === "string") ? args : args[0],
i;
//确保该函数做为狗仔函数被调用
if(! (this instanceof Sandbox)){
return new Sandbox(modules, callback);
}
 
//向this添加属性
this.a = 1;
this.b = 2;
 
//向this对象添加模块
//不制定模块或指定“*”都表示使用所有模块 
if(!modules || modules === "*"){
for(i in Sandbox.modules){
if(Sandbox.modules.hasOwnProperty(i)){
moduls.push(i);
}
}
}
//初始化模块
for(i = 0; i < modules.length; i+= 1){
Sandbox.modules[[moduls[i]]](this);
}
 
callback(this);
}
 
Sandbox.prototype = {
name: "My Application",
version: "1.00",
getName: function(){
return this.name;
}
};
  </script>
    以上代码的关键部分:
    -1,存在一个类型的检查语句,检查this是否为Sandbox的实例。
    -2,可以在该构造函数中将一些属性添加到this中。
    -3,所需的模块可以魔窟名称数组的形式传递。

13,公有静态成员
    
 <script>
  //构造函数
var Gadget = function(){};
//静态方法
Gadget.isShiny = function(){
return "Static Method!";
};
 
//原型添加方法
Gadget.prototype.setPrice = function(price){
this.price = price;
};
 
console.log(Gadget.isShiny());//Static Method! 
 
var iphone = new Gadget();
iphone.setPrice(500);
console.log(typeof Gadget.setPrice);//undefined
console.log(typeof iphone.isShiny);//undefined
 
Gadget.prototype.isShiny = Gadget.isShiny;
console.log(iphone.isShiny());//Static Method!
  </script>

14,私有静态成员
    -1,以同一个构造函数创建的所有对象共享该成员
    -2,构造函数外部不可访问该成员。
 
<script>
var Gadget = (function(){
var counter = 0;
 
return function(){
console.log(counter += 1);
}
}());//立即执行
 
var g1 = new Gadget();//1
var g2 = new Gadget();//2
  </script>
15,链模式
    如:
myObj.method1("11").method2("w").method3();
16,method方法
    
var Person = function(name){
this.name = name;
}.method("getName", function(){
return this.name;
});

















转载于:https://www.cnblogs.com/jingLongJun/p/4491078.html

相关文章:

174. Dungeon Game

一、题目 1、审题 2、分析 只能向右、向下移动的王子&#xff0c;从左上角要到右下角救公主&#xff0c;每经过一个方格&#xff0c;可能获得血瓶加血量&#xff0c;或者碰到怪物减血量&#xff0c;当王子血量 < 1 时就挂了&#xff0c;为了能成功救得公主&#xff0c;求王子…

DotNetNuke安装与下载

【下载专区】 DotNetNuke (DNN) 5.1 稳定版正式发布 http://www.dnnmix.com/dotnetnuke-dnn-51-released/ DotNetNuke (DNN) 资源共享 http://www.dnnmix.com/resources/ DotNetNuke官方下载 http://www.dotnetnuke.com/tabid/125/default.aspx 【安装教程】 DotNetNuke安装大…

1025 反转链表

1. 第一次做链表题&#xff0c;但是这题其实也就是套了个链表的壳子&#xff0c;虽然在结点的结构体里面有下一节点地址next这个属性&#xff0c;但是也只在最初给结点标序号时用到&#xff0c;由于没有真正对链表实施倒序&#xff0c;所以后面输出的下一结点的地址实际上只是算…

关于margin

<html><body><div style"width:200px;height:200px;background-color:red;> <div style"width:100px;height:100px;background-color:black;margin-left:300px;"></div></div></body></html> 左边是火狐显示&a…

DNS迭代式和递归式域名查询对比

背景知识&#xff1a;DNS数据库是树状的层次式的 本地域名服务器并不在这个体系当中&#xff0c;它相当于这个体系面向用户的代理。 迭代式&#xff1a;DNS server告诉用户&#xff1a;我不认识这域名&#xff0c;但我知道你可以问哪个DNS服务器 递归式&#xff1a;用户告诉D…

UIActionSheet在iOS8中被弃用造成的错误

UIActionSheet在iOS7.0中效果图如下&#xff1a; UIActionSheet在iOS8中效果图如下&#xff1a; 造成这样的原因&#xff0c;是因为此控件在iOS8中被弃用了&#xff0c;而使用了UIAlertViewController替代的原因&#xff0c;具…

SQL分页语句(转)

有关分页 SQL 的资料很多&#xff0c;有的使用存储过程&#xff0c;有的使用游标。本人不喜欢使用游标&#xff0c;我觉得它耗资、效率低&#xff1b;使用存储过程是个不错的选择&#xff0c;因为存储过程是经过预编译的&#xff0c;执行效率高&#xff0c;也更灵活。先看看单条…

一个考查作用域以及闭包的题目

var a 2;var func (function(){ var a 3; return function(){a;console.log(a); } })(); func();func(); 1.涉及的知识点&#xff1a; &#xff08;1&#xff09;JS变量的作用域 &#xff08;2&#xff09;闭包2.变量的作用域&#xff0c;通俗来说就是变量所能起到作用的范围…

弄懂“进程”(上):3个组成部分、4个基本特征、4个基本状态

目录 进程实体的三个部分 1.PCB 2.程序段 3.相关的数据段 进程的四大特征 1.动态性 2.并发性 3.独立性 4.异步性 进程的状态(3个基本挂起) 1.三个基本状态 2.挂起状态 进程实体的三个部分 1.PCB 作用是让参与并发执行的每个程序独立运行&#xff0c;或者说&…

解决Failed to execute goal org.apache.maven.plugins

1.Maven构建失败 Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin: 2.3 . 2 :compile ( default-compile) on project oecp: Compilation failure 2.解决方法 把jdk换成自己安装的jdk 换后&#xff0c;再maven install就可以了转载于:https://www.cnb…

P4722 【模板】最大流

P4722 【模板】最大流 加强版 / 预流推进 今日心血来潮&#xff0c;打算学习hlpp 然后学了一阵子。发现反向边建错了。容量并不是0.qwq 然后就荒废了一晚上。 算法流程的话。有时间补上 #include<cstdio> #include<algorithm> #include<iostream> #include&l…

与我们的书合影——在2009北京国际图书展(BIBF)

2009年9月5日&#xff0c;武汉博文编辑许莹、夏青观看了于国展旧馆&#xff08;静安庄&#xff09;举行的2009北京国际图书展&#xff08;BIBF&#xff09;“专业场”。在电子工业出版社展台&#xff0c;编辑兴奋地与我们的几本畅销书&#xff08;《把时间当作朋友》、《走出软…

弄懂“进程”(下):进程的控制、同步和通信

进程控制 是进程管理的主要功能&#xff0c;负责创建和终止进程、进程执行过程中的状态转换。 由操作系统内核通过原语实现。 1.OS内核 常驻内存的、紧靠硬件的软件层次&#xff0c;运行在系统态(又称管态、内核态)&#xff0c;以免遭到用户程序的破坏。 主要包括&#xf…

(转自Timon's wang blogs)C#实现web信息自动抓取

原文转自&#xff1a;http://www.csharp.net.cn/post/C实现web信息自动抓取.html主要为了学习一下相关的网络蜘蛛&#xff0c;为自己获取信息使用背景 随着Internet的普及&#xff0c;网络信息正以极高的速度增长&#xff0c;在这么多数据中找到自己需要的信息是一件很繁琐的事…

数据结构-栈与队列

栈的定义 栈是限定仅在表尾进行插入和删除操作的线性表 我们把允许插入和删除的一端称为栈顶 (top) &#xff0c;另一端称为栈底 (bottom) &#xff0c;不含任何数据元素的栈称为空栈。 栈又称为后进先出 (Last In Filrst Out) 的线性表&#xff0c;简称LIFO结构。 理解栈的定义…

雷观(七):靠谱的程序员,不是随便一个码农就可以做到的

在学习Web开发4年之后&#xff0c;我自己可以独立做一些基本的项目了。在加入前单位秒针&#xff0c;也做了几个Web项目。 我发现一个现象&#xff0c;很多公司大部分的Web项目&#xff0c;用到的技术很少&#xff0c;主要就是SSH等框架&#xff0c;实现一些行业的业务逻辑&…

1032 Sharing

思路很简单&#xff0c;不要想多了&#xff0c;就是找第一个出现的共同字母&#xff0c;即使后面不一样了也没关系。 经验收获如下&#xff1a; 1. 5位整数算小整数&#xff0c;用静态链表&#xff0c;本质上是哈希。 2. 读入字符型的时候千万注意空格。 AC代码 #include&…

Magento开发的特点有哪些?

Magento是一套专业开源的电子商务系统&#xff0c;也是目前主流的外贸网站购物系统&#xff0c;都是居于PHP语言开发的&#xff0c;数据库使用的是Mysql&#xff0c;且浏览界面很适合欧美用户的使用习惯。Magento开发设计得非常灵活&#xff0c;具有模块化架构体系和丰富的功能…

Linux多任务编程之五:exit()和_exit()函数(转)

来源&#xff1a;CSDN 作者&#xff1a;王文松 转自&#xff1a;Linux公社 ------------------------------------------------------------------------------------------------------------------------------------------------ wait()和waitpid() 函数说明 wait()函数用…

LogMiner日志分析工具的使用

1.安装logminer&#xff1a; 要安装LogMiner工具&#xff0c;必须首先要运行下面这样两个脚本&#xff0c; $ORACLE_HOME/rdbms/admin/dbmslm.sql $ORACLE_HOME/rdbms/admin/dbmslmd.sql. 这两个脚本必须均以SYS用户身份运行。 *************使用字典文件…

1052 Linked List Sorting

1. 开始测试点4不通过&#xff0c;得分24/25&#xff0c;是忽略了所有节点都不在链表上的特殊情况。 2. 其实就是用静态链表&#xff0c;把结点根据值的大小&#xff0c;升序排列&#xff0c;所以一开始把每个结点的key赋值为超出最大值的maxn&#xff0c;是为了方便输出。 3…

C#尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

用VS2012调试时发现在调用数据集时提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。” 用管理员身份运行CMD&#xff0c;输入netsh winsock reset并回车 转载于:https://www.cnblogs.com/CandiceW/p/4204552.html

TFS2008 + Windows2003 + Sql2005 安装注意事项

TFS2008并不是一个很容易安装的软件&#xff0c;很多时候能否顺利安装成功跟人品有关(笑)&#xff0c;要想一次安装成功&#xff0c;强烈建议准备一个全新的干净系统。 1.系统 最好采用刚安装好的windows2003&#xff0c;注意要打上sp2&#xff0c;安装IIS(如果IIS默认站点的主…

发票拍照识别OCR

发票拍照识别系统还可与政府、企事业单位、工商等多个行业的业务流程系统无缝结合&#xff0c;辅助办公人员进行发票等单据的信息录入&#xff0c;提高资料电子化、数据格式化的效率。 那么发票拍照识别系统有哪些技术特点呢&#xff1f; 1、中安发票拍照识别系统支持安卓andro…

1097 Deduplication on a Linked List

1. 开始测试点4不通过&#xff0c;检查后发现是犯了低级错误&#xff0c;把表示绝对值有无出现的整型数组的大小设置为了4000(题目中说绝对值不会超过10的4次方)&#xff0c;所以最小也该是10001。 2. 我认为和其他链表题相比&#xff0c;本题是不需要给结点加特殊属性用来排序…

搞定MyBatis

对于从事 Java EE 的开发人员来说&#xff0c;iBatis 是一个再熟悉不过的持久层框架了&#xff0c;在 Hibernate、JPA 这样的一站式对象 / 关系映射&#xff08;O/R Mapping&#xff09;解决方案盛行之前&#xff0c;iBaits 基本是持久层框架的不二选择。即使在持久层框架层出不…

6-6.用HLSL定义点光源

6-6.用HLSL定义点光源问题直到现在&#xff0c;你已经用定向光照亮你的场景&#xff0c;它对添加阳光到3D世界很有用。常常&#xff0c;你也将需要一个单点光照&#xff0c;例如手电筒或爆炸。这种光源叫点光源。方案从你的XNA项目传递点光源的3D位置到你的XNA effect。为每个顶…

2018 JVM 生态报告:79% 的 Java 开发者使用 Java 8

百度智能云 云生态狂欢季 热门云产品1折起>>> 2018 JVM 生态调查报告已于近日发布&#xff0c;该报告由 Snyk 和 The Java Magazine&#xff08;Oracle 的双月刊&#xff09;联合推出&#xff0c;旨在了解 JDK 的实现、工具、平台和应用方面的前景。基于超过 10200 …

广度优先搜索(BFS)模板

伪代码 void BFS(int S){queue<int> q;q.push(s);while(!q.empty()){取出队首元素top;访问队首元素top;将队首元素出队;将top的下一层结点中未曾入队的结点全部入队&#xff0c;并设置为已入队;} } 说明 1. 定义队列q&#xff0c;并将起点s入队 2. 写一个while循环&a…

static关键字和内存使用

1 static静态的&#xff0c;用来修饰属性&#xff0c;方法&#xff0c;代码块&#xff0c;内部类 2 当其中一个变量对此属性进行修改&#xff0c;会导致其他对象对此属性的一个调用 vs 实例变量&#xff1a;对象各有一套副本 3 静态变量和方法随着类的加载而加载&#xff0c;可…