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

七、对象常量

  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. Selenium 实现自动下载文件(FirefoxOptions,FirefoxProfile) - 根据Selenium Webdriver3实战宝典

    Firefox 版本是72geckodriver 是 0.24selenium 是3.14 代码中注释有关于FirefoxOptions,FirefoxProfile的解释,请各位寻找一下,不做另外解 ...

  2. Python——详解collections工具库

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天为大家介绍Python当中一个很好用也是很基础的工具库,叫做collections. collection在英文当中有容器的意思,所以顾 ...

  3. meterpreter会话渗透利用常用的32个命令归纳小结

    仅作渗透测试技术实验之用,请勿针对任何未授权网络和设备. 1.background命令 返回,把meterpreter后台挂起 2.session命令 session 命令可以查看已经成功获取的会话 ...

  4. 使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less

    之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助. 多HTML网站 ...

  5. Java基础--数组的定义

    1.数组的定义 数组:一组能够储存相同数据类型值的变量的集合. 2.数组的赋值方式 (1)使用默认的初始值来初始化数组中的每一个元素 语法:数组元素类型[]数组名 = new数组元素类型[数组中元素的 ...

  6. 东南大学RM装甲板识别算法详解

    rm中,装甲板的识别在比赛中可谓是最基础的算法.而在各个开源框架中,该算法也可以说最为成熟.出于学习目的,之后将对比多个高校或网络代码(),尝试学习各个rm装甲板识别算法的优点和流程. 这次先是东南大 ...

  7. 2019年最新老男孩高性能Web架构与自动化运维架构视频教程

    课程目录L001-老男孩架构15期-Web架构之单机时代L002-老男孩架构15期-Web架构之集群时代L003-老男孩架构15期-Web架构之dnsL004-老男孩架构15期-Web架构之缓存体系L ...

  8. ElementUI el-table 在flex下的宽度自适应问题

    BUG:在flex容器下面的一个flex:1的子容器里面写了个el-table用来展示列表数据,在做宽度自适应测试的时候发现该组件的宽度只会增加不会缩小. Debug:通过控制台发现组件生成的tabl ...

  9. JavaScript对象(三)

    序列化对象: 对象序列化:对象的状态转化为字符串,也可以将字符串还原为对象.方法:JSON.stringify(),用来序列化,JSON.parse(),用来还原对象. JSON(JavaScript ...

  10. 【面试经验分享】java面试中的那些潜规则

    1.大纲 潜规则1:面试的本质不是考试,而是告诉面试官你会做什么 很多刚入行的小伙伴特别容易犯的一个错误,不清楚面试官到底想问什么,其实整个面试中面试官并没有想难道你的意思,只是想通过提问的方式来知道 ...