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. 有关css3的一些问题

    CSS3新特性(阴影.动画.渐变.变形.伪元素等) CSS3与页面布局学习总结--CSS3新特性(阴影.动画.渐变.变形.伪元素等)     目录 一.阴影 1.1.文字阴影 1.2.盒子阴影 二.背 ...

  2. STURTS2 HELLOWORLD

    4. <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC " ...

  3. 曾经让我很吐血的Bug(初学者)

    1.MSSql 就是 sql Server. 2.用session的时候一定要先实现接口IRequiresSessionState: 3.form表单中type=file传送文件的时候一定要在form ...

  4. System.Data.DbType和数据库映射关系

    有如下类型的映射对照: System.Data.SqlClient.SqlDbType  System.Data.OleDb.OleDbType System.Data.Odbc.OdbcType S ...

  5. CODE[VS]-判断浮点数是否相等-浮点数处理-天梯青铜

    题目描述 Description 给出两个浮点数,请你判断这两个浮点数是否相等 输入描述 Input Description 输入仅一行,包含两个浮点数 输出描述 Output Description ...

  6. noip 2016 提高组题解

    前几天写的那个纯属搞笑.(额,好吧,其实这个也不怎么正经) 就先说说day2吧: T1:这个东西应该叫做数论吧. 然而我一看到就照着样例在纸上推了大半天(然而还是没有看出来这东西是个杨辉三角) 然后就 ...

  7. TortoiseSVN 1.8 关于右键的设置

    以前用SVN但都是 IDE 自己集成的插件,最近使用 android studio 发现居然自己不带SVN command line插件,非得自己单独装一个,于是使用了 TortoiseSVN ,但用 ...

  8. [Q]关于无法进入主界面问题解答

    打图精灵适用于AutoCAD2007或更高版,低于2007版无法使用. 若在安装打图精灵前AutoCAD已经打开,则需要将AutoCAD重新打开,然后使用“QPlot”命令. 若重新打开仍然调不出界面 ...

  9. shell获取系统时间

    获取系统时间 date -d"yesterday" +"%F %H:%M:%S" #输出昨天这个时候的时间 date -d"tomorrow" ...

  10. centOS静态ip设置

    设置静态IP地址 1,先搜索了一下,得到以下解释IP          P地址Netmark     子网掩码Gateway     默认网关HostName    主机名称DomainName  域 ...