这周也是拿到了同程的offer,从此走上了前端之路!感谢我的贵人们。再次纪念一下~!

第11章 不是你的对象不要动

11.1 什么是你的

你的对象:当你的代码创建了这些对象或者你有职责维护其他人的代码的对象时,你就拥有这些对象。

不是你的对象:

  • 原生对象(Object、Array等等)
  • DOM对象(例如:Document)
  • 浏览器对象模型(BOM)对象(例如: window)
  • 类库的对象

11.2.1 不覆盖方法

JavaScript这门语言也存在着糟粕,那就是覆盖一个已经存在的方法是难以置信的容易- -即使那个神圣的  document.getElementById()方法也不例外。

         // 不好的写法
document.getElementById = function() {
return null; //引起混乱
}

所以这里不做更多的例子,作者以自己的亲身经历告诉我们:不覆盖方法才是明智的选择。

11.2.2 不新增方法

作者举了个Prototype JavaScript类库的发展历史的例子说明了:不新增方法同样也是明智的选择。

11.2.3 不删除方法

删除一个方法有俩种手段:

1、把方法赋值为null

2、使用delete操作符来删除,但是它只能在对象的实例和方法起作用,如果在prototype的属性和方法上使用delete是不起作用的

作者也十分干脆:删除一个已存在对象的方法是糟糕的实践。

11.3 更好的途径

更好的方法就是不直接修改这些对象,而是扩展它,也就是我们通常所说的继承。

JavaScript中有俩种基本的继承方式:基于对象的继承和基于类型的继承。

① 基于对象的继承

ECMAScript5中Object.create()方法是实现这种继承的最简单的方式(如果你不熟悉,《JS权威指南》第121页有详解):

    var person = {
name : "Nicholas",
sayName : function() {
alert(this.name);
}
};
var myPerson = Object.create(person);
myPerson.sayName(); // 弹出"Nicholas"

原理:Object.create这个方法会返回一个空函数的实例,这个空函数的原型属性(prototype)是person。同时myPerson.prototype指向了空对象的prototype, 这个空对象的prototype也就是person, 所以当在myPerson上调用sayName函数时,Js会顺着它的原型链向上查找并调用方法。

同时也推荐和感谢慕课网的Bosn老师对于原型和继承这方面的独到、深刻、犀利的讲解!

② 基于类型的继承

基于类型的继承和基于对象的继承工作方式是差不多的,它从一个已存在的对象继承,这里的继承是依赖与原型的。因此,基于类型的继承是通过构造函数实现的,而非对象。这意味着,需要访问被继承对象的构造函数。

        function MyError(message) {
this.message = message;
} MyError.prototype = new Error(); // MyError类继承自Error(所谓的超类)。给MyError.prototype赋值为一个Error的实例。然后,每个MyError实例从Error那里继承它的属性和方法, instanceof也能正常工作。
var error = new MyError("Something bad happened.");
console.log(error instanceof Error);
console.log(error instanceof MyError);

11.5 阻止修改

ECMAScript5引入了几个方法来防止对对象的修改。可以做到这样的事情:锁定这些对象,保证任何人不能有意无意地修改他们不想要的功能。以下三种修改的级别:

   · 防止扩展 ( preventExtension())

禁止为对象“添加”属性和方法,但已存在的属性和方法是可以被修改或删除的

· 密封 ( seal() )

     类似“防止扩展”,而且禁止为对象“删除”已存在的属性和方法

· 冻结  ( freeze() )

类似密封,而且禁止为对象“删除”已存在的属性和方法

每种锁定的类型都拥有俩个方法:一个用来实施操作,另一个用来检测是否应用了相应的操作。

下面的例子中,锁定了prevent对象防止被扩展,所以调用Object.isExtensible()函数返回false,试图为person对象扩展新增属性或方法将会悄无声息的失败。在严格模式下,试图为一个不可扩展的对象新增任何属性或方法都将会抛出一个错误。

        var person = {
name : "Nicholas"
}; // 锁定对象
Object.preventExtension(person);
console.log(Object.isExtensible(person)); //false
person.age = 25; //正常情况悄悄地失败,除非在strict模式下抛出错误

原理同上面相似,下面是Object.seal()函数

        // 锁定对象
Object.seal(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
delete person.name; // 正常情况悄悄地失败,除非在strict模式下抛出错误
person.age = 25; // 同上

使用Object.freeze()函数来冻结一个对象。可以使用Object.isFrozen()函数来检查一个对象是否已被冻结。

      // 锁定对象
Object.freeze(person);
console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
console.log(Object.isFrozen(person)); // true
person.name = "Greg"; // 正常情况下悄悄地失败,除非在strict模式下抛出错误
person.age = 25; // 同上
delete person.name; //同上

读《编写可维护的JavaScript》第11章总结的更多相关文章

  1. 读《编写可维护的JavaScript》第一章总结

    第一章 基本的格式化 1.4 ① 换行 当一行长度到达了单行最大的字符限制时,就需要手动将一行拆成俩行.通常我们会在运算符后换行,下一行会增加俩个层级的缩进. // 好的做法: 在运算符后换行,第二行 ...

  2. [已读]编写可维护的javascript

    13年4月份出版,作者是大名鼎鼎的Zakas,他的另两本书<javascript高级程序设计>与<高性能javascript>你一定听过或者读过. 这本书重点讲了编码风格和编码 ...

  3. 【读书笔记】读《编写可维护的JavaScript》 - 编程实践(第二部分)

    本书的第二个部分总结了有关编程实践相关的内容,每一个章节都非常不错,捡取了其中5个章节的内容.对大家组织高维护性的代码具有辅导作用. 5个章节如下—— 一.UI层的松耦合 二.避免使用全局变量 三.事 ...

  4. 拯救一切强迫症 - 读《编写可维护的 JavaScript》(一)

    拯救一切强迫症 - 读<编写可维护的 JavaScript>(一) 本文写于 2020 年 4 月 24 日 我在小学的时候就有接触过编程,所以读大一的时候 C 语言还算是轻车熟路.自然会 ...

  5. 《编写可维护的javascript》读书笔记(上)

    最近在读<编写可维护的javascript>这本书,为了加深记忆,简单做个笔记,同时也让没有读过的同学有一个大概的了解. 一.编程风格 程序是写给人读的,所以一个团队的编程风格要保持一致. ...

  6. 《编写可维护的JavaScript》之编程实践

    最近读完<编写可维护的JavaScript>,让我受益匪浅,它指明了编码过程中,需要注意的方方面面,在团队协作中特别有用,可维护性是一个非常大的话题,这本书是一个不错的起点. 本书虽短,却 ...

  7. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  8. 编写可维护的JavaScript 收纳架

    如果你看过Nicolas C.Zakas写过的任何作品,你必须承认他是个不折不扣的天才.也只有天才级的才能写出<JavaScript高级程序设计>让所有的前端攻城师人手一本.Nicolas ...

  9. 编写可维护的JavaScript之编程风格

    在团队中只有每个人的编程风格一致,大家才能方便的互相看懂和维护对方的代码. 1. 层级缩进 对于层级缩进目前有两种主张:1)使用制表符这种方法有两种好处,第一,制表符和缩进层级之间是一一对应关系,符合 ...

  10. 推荐一本好书:编写可维护的JavaScript(可下载)

    目录 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 下载: 有些建议: 推荐一本好书:编写可维护的JavaScript(可下载) 书摘: 很多设计模式就是为了解决紧耦合的问题.如果 ...

随机推荐

  1. spark读取hbase数据

    def main(args: Array[String]): Unit = { val hConf = HBaseConfiguration.create(); hConf.set("hba ...

  2. Hadoop等软件常见运行问题及解决办法

    Hadoop常见问题及解决办法  1.问题:java.io.IOException: Could not locate executable null\bin\winutils.exe in the ...

  3. 浏览器桌面通知--Notification

    前言 最近项目上要用到浏览器桌面通知,之前虽然知道有这个东西,但是一直没有用过,借此机会了解下桌面通知的机制,在此分享下. 1.权限 首先需要明确的是,不是所有网页都可以发桌面通知的,不然不得烦死,那 ...

  4. C/C++ 结构体 指针 简单输入输出

    #include <stdio.h> #include <stdlib.h> struct student{ int num; ]; double dec; }; int ma ...

  5. VBA控制outlook自动发送邮件(转)

    使用Excel VBA实现Outlook自动发送邮件 | 在工作上我们都会遇到批量发送邮件的情况,面对重复而规律性的工作,可以使用Excel的VBA实现自动批量化发送邮件.大大减小工作时间,提升工作效 ...

  6. js 控制浏览器窗口大小

    //打开一个新窗口并设置其大小window.open('index.html','','width=450,height=750,location=no,menubar=no,status=no,to ...

  7. php开发客服系统(持久连接+轮询+反向ajax 转载 http://www.tuicool.com/articles/2mU7v2R)

    php开发客服系统( 下载源码 ) 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向 ...

  8. 商品条形码(JBarcode)

    之前没有使用过这个,现在使用JBarcode生成商品条形码,工作之前的准备工作: Eclipse:Eclipse Java EE IDE for Web Developers.Version: Hel ...

  9. iOS 推送小记

    ios做推送功能时,最烦得就是各种证书的问题,以前自己做的时候经常要反复搞那些证书搞好几遍才能成功,现在发现归根到底都是appid这个东西搞错了,做个笔记记下来,以免忘了. 首先是程序里面注册推送的变 ...

  10. linux 中压缩记得压缩用c,解压用x

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...