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。

时间: 2024-12-19 13:42:39

Effective JavaScript :第四章的相关文章

javascript第四章总结

变量: javascript变量可以用来保存两种类型的值:基本类型和引用类型. 基本类型包括:Undefined,Null,Boolean,Number(用于所有的数值包括整数和浮点型) 和String. 这两者的特点是: 1.基本类型值在内存中占用固定大小的空间,一次被保存到栈的内存中: 2.从一个变量向里一个变量复制基本类型的值,会创建这个值的副本: 3.引用类型的值是对象,保存在堆得内存中: 4.包含引用类型的值得变量的实际上并不包含对象本身,而是一个指向该对象的指针: 5.从一个变量向另

慕课网JavaScript第四章编程练习

在一个大学的编程选修课班里,我们得到了一组参加该班级的学生数据,分别是姓名.性别.年龄和年级,接下来呢,我们要利用JavaScript的知识挑出其中所有是大一的女生的的名字哦. 学生信息如下: ('小A','女',21,'大一'),  ('小B','男',23,'大三'), ('小C','男',24,'大四'),  ('小D','女',21,'大一'), ('小E','女',22,'大四'),  ('小F','男',21,'大一'), ('小G','女',22,'大二'),  ('小H','女'

Effective JavaScript :第二章

1.熟练掌握闭包 理解闭包要学会三个基本的事实: ①JavaScript允许你引用在当前函数以外定义的变量: 例如: function makeSandwich(){ var magicIngredient = ‘peanut butter’; function make(filling){ return magicIngredient + ‘and’ + filling; } return make(‘jelly’); } makeSandwich(); //‘peanut butter an

JavaScript第四章

变量.作用域和内存问题 基本类型和引用类型的值 (1)基本类型:按值访问(Undefined.Null.Boolean.Number.String) (2)引用类型:按引用访问 基本类型 引用类型 动态属性 不能给基本类型的值添加属性 动态的添加.改变.删除属性和方法 复制变量值 在变量对象上创建一个新值,然后将该值复制到新变量分配的位置上(互不影响) 复制结束两个变量引用一个对象(互相关联) 传递参数 把函数外部的值复制给函数内部的参数 把这个值的内存地址复制给另一个局部变量 检测类型 使用t

[Effective JavaScript 笔记] 第一章:让自己习惯javascript小结

在这里整理一下,每条对应的提示 第1条:了解使用的js版本 确定应用程序支持的js的版本(浏览器也是应用程序噢) 确保使用的js特性是应用程序支持的(要不写了也运行不了) 总是在严格模式下编写和测试代码(面向未来编程) 合并代码时注意不同声明的严格模式(还是用第二种解决方案吧,省心) 第2条:理解JavaScript的浮点数 js的数字都是双精度的浮点数 js的整数仅仅是双精度浮点数的一个子集,不是单独的一个类型 位运算将数字视为32位的有符号整数 当心浮点运算的精度问题 第3条:当心隐式的强制

[读书笔记]Effective Java 第四章

使类和成员的可访问性最小化 规则很简单:尽可能地使每个类或者成员不被外界访问.实例域(非final)决不能是公有的.当需要暴露出不可变的实例时通常会把这个实例做成不可变或者是把这个实例变成私有,同时提供该实例的备份. 在公有类中使用访问方法而非公有域 这就是常说的getter和setter方法,提供给包外访问时提供必要的方法,限制客户端的行为,以便于将来可以在内部改变表示方法. 使可变性最小化 不可变的类比可变类更加易于设计.实现和使用.它们不容易出错,且更加安全.为了使类成为不可变,要遵循下面

从思维导图中学习javascript第四章流程语句

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

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

第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继承了HTMLElement,因而与其他HTML元素具有相同的默认属性.不过,HTMLFormElement也有它自己下列独有的属性和方法. 取得<form>元素的引用方式有好几种.其中最常见的方式就是将它看成与其他元素一样,并为其添加id特性,然后再像下面这样使用getElementById()方

JavaScript高级程序设计(第3版)第四章读书笔记

第四章 变量.作用域和内存问题 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.基本数据类型是:Undefined.Null.Boolean.Number和String.引用类型的值是保存在内存中的对象.JavaScript不允许直接访问内存中的位置,即不能直接操作对象的内存空间. 不能给基本类型的值添加属性,只能给引用类型值动态地添加属性. 从一个变量向另一个变量复制基本类型值时,两个变量可以参