javascript优化--07模式(对象)02
沙箱模式:
- 解决空间命名模式的几个缺点:
- 命名空间模式中无法同时使用一个应用程序或库的两个版本运行在同一个页面中,因为两者需要相同的全局符号;
- 以点分割,需要输入更长的字符,解析时间也更长;
- 全局构造函数 //在命名空间模式中,可以使用全局对象;在沙箱模式中主要使用全局构造函数
- 添加特征:
- 强制new模式
- 接受额外配置参数,指定对象实例所需的模块名;
- 例子
Sandbox(['ajax','event'], function (box) {});
--------------
Sandbox('ajax', 'event', function (box) {});
---------------
可以设置参数*表示所有可用的模块;或者不设参数来默认 Sandbox(*, function (box) {});
Sandbox(function (box) {});
- 添加特征:
- 增加模块: 通过增加静态属性
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 = 'mmm';
box.attachEvent = function() {};
box.dettachEvent = function() {};
}
Sandbox.modules.ajax = function(box) {
box.makeRequest = function() {};
box.getRequest = function() {};
} - 实现构造函数
function Sandbox() {
//将参数转化为数组
var args = Array.prototype.slice.call(arguments),
//最后一个是回调函数
callback = args.pop(),
//提取数组或单独的模块
modules = (args[0] && typeof args[0] === 'string') ? args : args[0],
i;
//强制new模式
if(!(this instanceof Sandbox)) {
return new Sandbox(modules, callback);
}
//向this添加需要的属性
this.a = 1;
this.b = 2;
//向this对象添加模块
//不指定模块或‘*’都表示使用所有模块
if(!modules || modules === '*') {
modules = [];
for(i in Sandbox.modules) {
if (Sandbox.modules.hasOwnProperty(i)) {
modules.push(i);
}
}
}
//初始化所需模块
for(i = 0; i < modules.length; i++) {
Sandbox.modules[modules[i]](this);
}
callback(this);
}
//添加需要的原型属性
Sandbox.prototype = {
name: 'My Application',
version: '1.0',
getName: function() {
return this.name;
}
}
静态成员: 静态属性和方法就是那些从一个实例到另一个实例都不会发生改变的属性和方法
- 公有静态成员:
var Gadget = function(price) {
this.price = price;
};
//静态方法
Gadget.isShiny = function () {
var msg = 'you bet';
if(this instanceof Gadget) {
msg += ', it costs $' + this.price + ' !';
}
return msg;
}; Gadget.prototype.isShiny = function() {
return Gadget.isShiny.call(this);
} var a = new Gadget('499.99');
a.isShiny(); - 私有静态成员:
- 同一个构造函数创建的所有对象共享该成员;
- 构造函数外部不能访问该成员;
var Gadget = (function () {
//静态变量/属性
var counter = 0,
NewGadget;
NewGadget = function () {
counter++;
}
//特权方法
NewGadget.prototype.getLastId = function () {
console.log(counter);
}
//
return NewGadget;
})(); var g1 = new Gadget();
g1.getLastId();
对象常量:
- 通用实现方法
var constant = (function () {
var constants = {},
ownProp = Object.prototype.hasOwnProperty,
allowed = {
string: 1,
number: 1,
boolean: 1
},
prefix = (Math.random() + '_').slice(2);
return {
set: function(name, value) {
if(this.isDefined(name)) {
return false;
}
if(!ownProp.call(allowed, typeof value)) {
return false;
}
constants[prefix + name] = value;
return true;
},
isDefined: function (name) {
return ownProp.call(constants, prefix + name);
},
get: function (name) {
if(this.isDefined(name)) {
return constants[prefix + name];
}
return null;
}
}
})();- set(name, value);
- isDefined(name);
- get(name);
链模式:用于调用对象的方法,当创建的方法返回值是无任何意义的值时,可以使它们返回this;
- 优点:代码更简洁,;可以分割函数创建简短,具有特定功能的函数,而不是创建实现太多功能的函数;
- 缺点:难以调试
method方法:语法糖的一种
例子:
if(typeof Function.prototype.method !== 'function') {
Function.prototype.method = function (name, implementation) {
this.prototype[name] = implementation;
return this;
}
};
var Person = function (name) {
this.name = name;
}
.method('getName', function () {
return this.name;
})
.method('setName', function (name) {
this.name = name;
return this;
});
var a = new Person('Adam');
javascript优化--07模式(对象)02的更多相关文章
- javascript优化--06模式(对象)01
命名空间: 优点:可以解决命名混乱和第三方冲突: 缺点:长嵌套导致更长的查询时间:更多的字符: 通用命名空间函数: var MYAPP = MYAPP || {}; MYAPP.namespace = ...
- javascript优化--11模式(设计模式)02
策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...
- javascript优化--09模式(代码复用)02
原型继承 ://现代无类继承模式 基本代码: var parent = { name : "Papa" } var child = object(parent); function ...
- javascript优化--13模式1(DOM和浏览器模式)
注意分离: 通过将CSS关闭来测试页面是否仍然可用,内容是否依然可读: 将JavaScript关闭来测试页面仍然可以执行正常功能:所有连接是否正常工作:所有的表单是否可以正常工作: 不使用内联处理器( ...
- javascript优化--08模式(代码复用)01
优先使用对象组合,而不是类继承: 类式继承:通过构造函数Child()来获取来自于另一个构造函数Parent()的属性: 默认模式:子类的原型指向父类的一个实例 function inherit(C, ...
- javascript优化--05模式(函数)
回调函数模式: 基本例子: var findNodes = function (callback) { ...................... if (typeof callback !== ' ...
- javascript优化--10模式(设计模式)01
单体模式:保证一个特定类仅有一个实例;即第二次使用同一个类创建新对象时,应该得到与第一个所创建对象完全相同对象: 在JS中,可以认为每次在使用对象字面量创建对象的时候,实际上就在创建一个单体: 当使用 ...
- javascript优化--12模式(设计模式)03
观察者模式 通过创建一个可观察的对象,当发生一个感兴趣的事件时将该事件通告给所有观察者,从而形成松散的耦合 订阅杂志 //发布者对象 var publisher = { subscribers: { ...
- javascript优化--14模式2(DOM和浏览器模式)
远程脚本 XMLHttpRequest JSONP 和XHR不同,它不受同域的限制: JSONP请求的可以是任意的文档: 请求的URL通常格式为http://example.js?calback=Ca ...
随机推荐
- Flip Game(dfs)
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32384 Accepted: 14142 Des ...
- 一个PHP写的简单webservice服务端+客户端
首先是服务端,服务端有一个主要的class组成:apiServer.php <?php /** * apiServer.php * * webservice主类 * * @filename ap ...
- 淘宝(阿里百川)手机客户端开发日记第六篇 Service详解(四)
DEMO1:在Activity里声明一个回调方法,当service完成任务后,调用这个回调方法. 首先,我们先继承service,来创建服务,代码如下: package com.example.ser ...
- NGUI 学习笔记实战之二——商城数据绑定(Ndata)
上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客 NGUI 学习笔记实战——制作商城UI界面 ht ...
- UITableView 学习笔记
http://www.cnblogs.com/smileEvday/archive/2012/06/28/tableView.html UITableView学习笔记 作者:一片枫叶 看TableVi ...
- Coursera台大机器学习课程笔记11 -- Nonlinear Transformation
这一节讲的是如何将线性不可分的情况转为非线性可分以及转换的代价.特征转换是机器学习的重点. 最后得出重要的结论是,在做转换时,先从简单模型,再到复杂模型. 参考:http://www.cnblogs. ...
- Coursera台大机器学习课程笔记9 -- Logistic Regression
如果只想得到某种概率,而不是简单的分类,那么该如何做呢?在误差衡量问题上,如何选取误差函数这段很有意思. 接下来是如何最小化Ein,由于Ein是可凸优化的,所以采用的是梯度下降法:只要达到谷底,就找到 ...
- spring boot实战(第十二篇)整合RabbitMQ
前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...
- Sharepoint程序员应该了解的知识
做为一个Sharepoint程序员应该了解的知识:注意,我说的是程序员.因为我一直把自己看一个普普通通的程序员. 前提: 要知道网络基础(包括DHCP.IP.掩码.DNS.网关.广播),会装操作系统( ...
- Web Components之Custom Elements
什么是Web Component? Web Components 包含了多种不同的技术.你可以把Web Components当做是用一系列的Web技术创建的.可重用的用户界面组件的统称.Web Com ...