Effective JavaScript :第四章
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 :第四章的更多相关文章
- [Effective Java]第四章 类和接口
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Effective JavaScript :第二章
1.熟练掌握闭包 理解闭包要学会三个基本的事实: ①JavaScript允许你引用在当前函数以外定义的变量: 例如: function makeSandwich(){ var magicIngredi ...
- Effective JavaScript :第一章
第一章 一.严格模式与非严格模式 1.在程序中启用严格模式的方式是在程序的最开始增加一个特定的字符串字面量: ‘use strict’ 同样可以在函数体的开始处加入这句指令以启用该函数的严格模式. f ...
- javascript第四章--面向对象的程序设计
① 理解对象 ② 创建对象 ③ 继承
- 读《编写可维护的JavaScript》第四章总结
第四章 变量 函数和运算符 4.1 ① 变量声明 变量声明是通过var语句来完成的,并且所有的var语句都提前到包含这段逻辑的函数的顶部执行. function doSomething() { + v ...
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- 第四章 JavaScript操作DOM对象
第四章 JavaScript操作DOM对象 一.DOM操作 DOM是Document Object Model的缩写,即文档对象模型,是基于文档编程的一套API接口,1988年,W3C发布了第一级 ...
- 为什么我要放弃javaScript数据结构与算法(第四章)—— 队列
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第四章 队列 队列数据结构 队列是遵循FIFO(First In First Out,先进先出,也称为先来先服务)原则的一组有序 ...
随机推荐
- JavaEE XML DOM创建之DOM4J
DOM4J创建xml文档 @author ixenos 1 写出内容到xml文档 XMLWriter writer = new XMLWriter(OutputStream, OutputForamt ...
- js 技巧1
1. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和!==不会,它们会同时比较值和数据类型,这也使得它们要比==和!=快. "){ //速度慢 } & ...
- Linux升级glibc
参考http://www.linuxidc.com/Linux/2015-04/116472.htm via 红孩儿你好 一.简介 glibc是gnu发布的libc库,即c运行库.glibc是linu ...
- mac git 的安装 及实现自动补全
1.检查是否装了brew $ brew list如果没有,拷贝以下命令到终端 回车.可以安装好brewruby -e "$(curl -fsSL https://raw.githubuser ...
- mysql中You can't specify target table for update in FROM clause
使用mysql在删除表中重复记录 delete from user where username in (select user name form(select username from user ...
- COCOS2D-JS入门-官网template源码解析
首先介绍几个概念: 导演: 导演 (Director)是Cocos2d-JS引擎抽象的一个对象,Director是整个Cocos2d-JS引擎的核心,是整个游戏的导航仪,游戏中的一些常用操作就是由Di ...
- Tiny6410之NAND FLASH驱动
一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...
- HaoZip(好压) 去广告纯净版 4.4
软件名称: 好压 去广告纯净版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win8 / Win7 / Vista / WinXP 软件大小: 6.3MB 图片预览: 软件简介: 好压去广 ...
- 使用Gradle创建java web项目
什么是Gradle? Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML ...
- php取整
php取整的方法一共有4中,分别是ceil(),floor(),round(),intval(). 1.ceil--向上取整,即不小于当前的下一个整数,如果有小数则进一位. 返回的是float类型 & ...