1.理解:prototype、getPrototypeOf和_proto_之间的不同

①C.prototype用于建立new C()创建的对象的原型。

②Object.getPrototypeOf(obj)是ES5中用来获取obj对象的原型对象的标准方法。

③obj._proto_是获取obj对象的原型对象的非标准方法。

类的本质上是一个构造函数与一个用于在该类实例间共享方法的原型对象的结合。

 

2.使用闭包存储私有数据

JavaScript的对象所有的属性名都是一个字符串,任意一段程序都可以简单地通过访问属性名来获取相应的对象属性。例如,for......in循环、ES5的Object.keys()和Object.getOwnPropertyNames()函数等特性都能轻易地获取到对象的所有属性名。

闭包是一种简朴的数据结构,它们将数据存储到封闭的变量中而不提供对这些变量的直接访问。获取闭包内部结构的唯一方式是该函数显示地提供获取它的途径。

闭包变量是私有的,只能通过局部的引用获取。

将局部变量作为私有数据从而通过方法实现信息隐蔽。

 

3.this变量的隐式绑定

每一个函数都有一个this变量的隐式绑定。该this变量的绑定值是在调用该函数时确定的。this变量的作用域总是由其最近的封闭函数所确定的。使用一个局部变量使得this绑定对于内部函数是可用的。

 

4.避免继承标准类

继承标准类的子类往往会由于一些特殊的内部属性(如[[class]])而被破坏。例如:

function Dir(path,entries){
this.path = path ;
for(var i = 0 , n = entries.length ; i < n ; i ++){
this[i] = entries[i] ;
}
}
Dir.prototype = Object.create(Array.prototype) ;

这种方式破坏了length属性的预期行为。length属性只在内部被标记为“真正的”数组的特殊对象起作用。ECMAScript标准规定它是一个不可见的内部属性,称为[[class]]。当我们扩展Array类时,子类的实例并不是通过new Array()或字面量[]语法创建的,所以Dir的实例的[[class]]属性值为“Object”。所以我们可以定义一个entries数组的实例属性:

function Dir(path , entries){
this.path = path ;
this.entriess = entries ;
}

在原型中重新定义Array的方法,我们可以将这些相应的方法委托给entries属性来完成。

Dir.prototype.forEach = function(f , thisArg){
if(typeof thisArg === “undefined”){
thisArg = this;
}
this.entries.forEach(f , thisArg) ;
}

ECMAScript标准库中的大多数构造函数都有类似的问题。某些属性或方法期望具有正确的[[class]]属性或其他特殊的内部属性,然而子类却无法提供。基于这个原因,最好避免继承以下的标准类:Array、Boolean、Date、Function、Number、RegExp或String。

Effective JavaScript :第四章的更多相关文章

  1. [Effective Java]第四章 类和接口

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. Effective JavaScript :第二章

    1.熟练掌握闭包 理解闭包要学会三个基本的事实: ①JavaScript允许你引用在当前函数以外定义的变量: 例如: function makeSandwich(){ var magicIngredi ...

  3. Effective JavaScript :第一章

    第一章 一.严格模式与非严格模式 1.在程序中启用严格模式的方式是在程序的最开始增加一个特定的字符串字面量: ‘use strict’ 同样可以在函数体的开始处加入这句指令以启用该函数的严格模式. f ...

  4. javascript第四章--面向对象的程序设计

    ① 理解对象 ② 创建对象 ③ 继承

  5. 读《编写可维护的JavaScript》第四章总结

    第四章 变量 函数和运算符 4.1 ① 变量声明 变量声明是通过var语句来完成的,并且所有的var语句都提前到包含这段逻辑的函数的顶部执行. function doSomething() { + v ...

  6. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  7. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  8. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

  9. 第四章 JavaScript操作DOM对象

    第四章   JavaScript操作DOM对象 一.DOM操作 DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API接口,1988年,W3C发布了第一级 ...

  10. 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列

    有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...

随机推荐

  1. Mac + nginx + lua + luasocket + cjson

    1. Lua // 官方网站 http://www.lua.org/ 下载源码包// 由于配合 nginx 使用, 所以使用 5.1.X 版本 $ .tar.gz $ cd lua- $ make m ...

  2. Logstash安装搭建(一)

    Logstash是一个具有实时管道的开源数据收集引擎.可以动态地统一不同来源的数据,并将数据归到不同目的地.也是一个管理事件和日志工具.你可以用它来收集日志,分析它们,并将它们储存起来以供以后使用. ...

  3. 关于Two-Pass标记连通域个数

    关于Two-Pass标记连通域个数 背景 在完成图像的一系列处理后,得到二值图,一般会统计目标数量,即是获取连通域个数,这里采用TwoPass的方法. 基本思想 在Two-pass连通域标记中,第一次 ...

  4. centos 编译安装nginx

    这里选用的是nginx-1.10.1稳定版,其基础依赖库有gcc.gcc-c++.pcre.zlib和openssl. pcre.zlib和openssl这三个依赖库在安装nginx时无需编译安装,下 ...

  5. js中width,height,left,top计算

    ①offset    包括了元素的边框和内边距和滚动条 offsetWidth.offsetHeight元素的宽度和高度 offsetLeft .offsetTop元素相对于文档左边和顶部的距离(定位 ...

  6. 开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释

    软件开发者要开源软件,不单单是开放源代码就可以了,选择一种许可证很重要,一个许可证之于软件就相当于价值观之于普通人,代表了这个软件的基本品性.一个错误的许可证选择可能会直接导致整个项目的失败. 各种开 ...

  7. TCP TIME_WAIT详解

    转自:http://m.blog.chinaunix.net/uid-20384806-id-1954363.html TIME_WAIT状态 TCP要保证在所有可能的情况下使得所有的数据都能够正确被 ...

  8. 免费SSL证书申请

    https://buy.wosign.com/free/#apply 和 http://www.startssl.com/

  9. 如何让有物理键的手机在ActionBar始终显示更多菜单menu键

    仅作记录代码用,功能未能测试成功,在低版本上不存在 sHasPermanentMenuKey 属性,会出现 java.lang.NoSuchFieldException: sHasPermanentM ...

  10. SQL中游标的使用--遍历数据逐行更新或删除:相当于for循环

    --------------------------------------例子1 单纯的游标-------------------------------- create TABLE Table1 ...