我们学完了大部分对象创建模式相关的内容,下面还有一些小而精的部分。

七、对象常量

  JavaScript中没有常量的概念,虽然许多现代的编程环境可能为您提供了用以创建常量的const语句。作为一种变通方案,JavaScript中常见的一种方法是使用命名约定,使那些不应该被修改的变量全部用大写字母以突出显示。实际上这个命名约定已经用于内置JavaScript对象中了。

console.log(Math.PI);
console.log(Math.SQRT2);

  对于您自己的常量,也可以采用相同的命名约定,并且将它们以静态属性的方式添加到构造函数中。

// 构造函数
var Widget = function () {
// 实现...
}; // 常数
Widget.MAX_HEIGHT = 320;
Widget.MAX_WIDTH = 480;

  同样的命名约定还可应用于以字面量创建的对象中,这些常量可以是以大写字母命名的正常属性。

  如果你真的想拥有一个不可变的值,可以创建一个私有属性并提供一个取值(getter)方法,但并不提供设值函数(setter)。不过在许多情况下,当可以采用简单的命名公约取值时,这种不提供设置函数的方法可能显得矫枉过正。

  下面是一个通用的constant(常量)对象实现方法示例,它提供了下列方法:

  set(name, value)

    定义一个新的常量。

  isDefined(name)

    检测是定常量是否存在。

  get(name)

    读取指定常量的值。

  在这个实现中,只有原始值(primitive value)允许设为常量。此外,一些额外的注意事项是要确保声明的常量与内置属性名不会冲突,比如toString或hasOwnProperty等,可以通过使用hasOwnProperty()检测名称,并且在所有的常量名前面添加随机生成的前缀,从而确保名称之间相互适应。

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;
}
}
}()); // 测试以上实现代码
// 检查是否已经定义
constant.isDefined("maxwidth"); // 定义
constant.set('maxwidth',480); // 再次检查
constant.isDefined('maxwidth'); // 试图重新定义
constant.set("maxwidth",320); // 该值是否扔保持不变
constant.get("maxwidth");

  

八、链模式

  链模式(Chaining Pattern)可以使您能够一个接一个的调用对象的方法,而无需将前一个操作返回的值赋给变量,并且无需将您的调用分割成多行:

myobj.method1("hello").method2().method3("world").method4();

  当创建的方法返回的是无任何意义的值时,可以使它们返回this,即正在使用的对象的示例。这将使对象的用户调用前面连接的下一个方法:

var obj = {
value:1,
increment: function () {
this.value += 1;
return this;
},
add: function(v) {
this.value += v;
return this;
},
shout:function () {
alert(this.value);
}
}; // 链方法调用
obj.increment().add(3).shout();

  

链模式的优点和缺点

  使用链模式的一个优点在于可以节省一些输入的字符,并且还可以创建更简洁的代码,使其读起来就像一个句子。

  另一个优点在于它可以帮助您考虑分割函数,以创建更加简短、具有特定功能的函数,而不是创建尝试实现太多功能的函数。从长远来看,这提高了代码的可维护性。

  链模式的一个缺点在于以这种方式编写的代码更加难以调试。或许直到在某个特定的代码行中发生错误,但是在此行中实际执行了太多步骤。当链中多个方法其中一个静默失效时,无法直到是哪一个方法失效了。

  在任何情况下,识别出这种模式都很有好处。当编写的方法并没有明显和有意义的返回值时,可以总是返回this。该模式得到了广泛的应用,比如在jQuery库中就使用了该模式。此外,如果查看DOM的API,那么还可以注意到它的结构也倾向于链模式。

九、method()方法

  JavaScript可能会使用那些以类的方式思考的程序员感到困惑。这就是为什么一些开发人员倾向于选择使JavaScript更加类似类。其中一个这样的尝试是Douglas Crockford引入method()方法的思想。现在回想起来,他承认使JavaScript类似类的思想并不是值得推荐的方案,但是它仍然是一种令人关注的模式,有可能在一些应用程序中遇到这种模式。

  使用构造函数看起来就像是在使用Java中的类。它们还能够支持您向构造函数主体中的this 添加实例属性。然后这种向this添加方法的机制其实效率十分低下,原因在于它们最终都会与每个实例一起被重新创建,并且消耗更多的内存空间。这也就是为什么可服用方法应该添加到构造函数的prototype属性中的原因。

  向编程语言中添加便利的功能通常也称之为语法糖。在这种情况下,method()方法也可以称之为“糖方法(sugar method)”。

  使用method()定义类的方法形式如下:

var Person = function (name) {
this.name = name;
}.
method('getName',function() {
return this.name
}).
method('setName',function(name) {
this.name = name;
return this;
})

  请注意构造函数是如何连接到method()的调用,其依次连接到下一个method()的调用,后面以此类推。这个例子遵循了前面介绍的链模式,它可以帮助您以单个声明语句定义整个“类”。

  method()方法有两个参数:新方法的名称、方法的实现。

var a = new Person('Adam');
a.getName();
a.setName('Eve').getName();
// 再次强调,请注意链模式已经生效,这是因为setName()返回了this,从而使得以上代码可以正常运行。 // 最后,我们看一下method()方法是如何实现的: if(typeof Function.prototype.metho !== 'function') {
Function.prototype.method = function (name,implementation) {
this.prototype[name] = implementation;
return this;
};
}

  在method()的实现中,首先我们应该认真的检查该方法是否已经实现过。如果没有,那么继续添加函数,并将其作为implementation参数传递给构造函数的原型。在这种情况下,this指的是构造函数,其原型得到了增强。

  对象创建模式的内容到这里就告一段落了,这一整章文章讲解了命名空间模式、声明依赖、私有模式、模块模式以及沙箱模式、对象常量、链模式等一系列有用的创建对象的方法。那么下一章,我们会学习下代码复用模式。很重要哦。

《JavaScript 模式》读书笔记(5)— 对象创建模式4的更多相关文章

  1. 《Javascript高级程序设计》读书笔记之对象创建

    <javascript高级程序设计>读过有两遍了,有些重要内容总是会忘记,写一下读书笔记备忘 创建对象 工厂模式 工厂模式优点:有了封装的概念,解决了创建多个相似对象的问题 缺点:没有解决 ...

  2. 设计模式---对象创建模式之原型模式(prototype)

    一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...

  3. C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder

    part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...

  4. 《Javascript模式》之对象创建模式读书笔记

    引言: 在javascript中创建对象是很容易的,可以使用对象字面量或者构造函数或者object.creat.在接下来的介绍中,我们将越过这些方法去寻求一些其他的对象创建模式. 我们知道js是一种简 ...

  5. 《JavaScript 模式》读书笔记(5)— 对象创建模式1

    这又是一个新的开始,对象的重要性不言而喻.在JavaScript中创建对象是十分容易的,之前聊过的对象字面量和构造函数都可以达到目的.但是本篇中,我们越过那些方法,以寻求一些额外的对象创建模式. 本篇 ...

  6. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  7. 深入理解JavaScript系列(47):对象创建模式(上篇)

    介绍 本篇主要是介绍创建对象方面的模式,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式1:命名空间(namespace) 命名空间可以减少全局命名所需的数量,避免命名冲突或过度. ...

  8. 深入理解JavaScript系列(48):对象创建模式(下篇)

    介绍 本篇主要是介绍创建对象方面的模式的下篇,利用各种技巧可以极大地避免了错误或者可以编写出非常精简的代码. 模式6:函数语法糖 函数语法糖是为一个对象快速添加方法(函数)的扩展,这个主要是利用pro ...

  9. 设计模式---对象创建模式之构建器模式(Builder)

    一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...

随机推荐

  1. 线程中断 interrupt 和 LockSupport

    本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题: 线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗? 判断线程是否中断的方法有几个,它们之 ...

  2. Ⅱ:python入门

    一.编程语言介绍 编程语言的分类: 机器语言 汇编语言 高级语言(编译型.解释型号) 总结: 执行效率:机器语言>汇编语言>高级语言(编译型>解释型) 开发效率:机器语言<汇编 ...

  3. 7-45 jmu-python-涨工资 (10 分)

    输入一组工资数据,写入列表.对于小于5000的工资,涨1.5倍.并输出涨后的工资数据. 输入格式: 数据之间空格隔开 输出格式: 涨工资后的数据,空格隔开.尾部 不带空格. 输入样例: 3000 40 ...

  4. Spring 事务传播机制和数据库的事务隔离级别

    Propagation(事务传播属性) 类别 传播类型 说明 支持当前事务 REQUIRED 如果当前没有事务,就新建一个事务.@Transaction的默认选择 支持当前事务 SUPPORTS 就以 ...

  5. Golang 使用Protocol Buffer 案例

    目录 1. 前言 2. Protobuf 简介 2.1 Protobuf 优点 2.2 Protobuf 缺点 2.3 Protobuf Golang 安装使用 3. Protobuf 通讯案例 3. ...

  6. 前端分享之cookie的使用及单点登录

    cookie是什么 cookie的英文意思是饼干.在计算机术语中指服务端存放在客户端的一段数据.这段数据在客户端每次进行http请求时会自动加在http请求报文中的header上:服务端在响应时,可以 ...

  7. JavaScript的数组系列

    数组 今天逆战班的学习主题关于Javascript的数组,主要有数组的概念.创建.分类.方法.遍历.经典算法...... 一.数组是什么呢?怎么写数组呢?数组有多少种呢? 数组的概念 对象是属性的无序 ...

  8. python社区要放弃了pip?版本信息里带警告很不寻常哦

    pip是python的一个包管理器. 今天再查询Pip3 -V 时,除了正常的版本信息外,多了几行信息 WARNING: pip is being invoked by an old script w ...

  9. 2019-2020-2 20174318张致豪《网络对抗技术》Exp1 PC平台逆向破解

    Exp1_PC平台逆向破解 前期准备 一.逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  10. Redis(7)——持久化【一文了解】

    一.持久化简介 Redis 的数据 全部存储 在 内存 中,如果 突然宕机,数据就会全部丢失,因此必须有一套机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的 持久化机制, ...