JavaScript语言精粹读书笔记

JavaScript语言精粹读书笔记

扩展类型的功能

我们可以给Object.prototype添加方法,从而让该方法对所有对象都可用。函数、数组、字符串、数字、正则表达式和布尔值同样适用

例子1

在这个例子里面,通过给 Function.prototype 增加一个method方法,我们下次再给对象新增方法的时候就不需要再次键入 protype 这几个字符。

如何使用这个新增方法呢?
例子2

因为在JavaScript中取整有分正负,实在丑陋,所以我们通过Number.prototype增加一个integer方法来改善它。他会根据数字的正负来判断是使用Math.ceiling还是Math.floor

特别注意
基本类型的原型是是公用结构,所以在类库混用的时候要特别小心。本身prototype就属于侵入式代码,过度使用会导致代码混乱不易维护(终于知道之前的那个prototype框架怎么死的了...)保险的做法就是只在确认没有该方法的时候才添加它,切勿去编辑自带方法

闭包

一个例子开始

这段代码会有什么问题呢? 按照预期,应该弹出一个对话框用来显示节点的序号,但是结果却是节点的总数目。
分析一下:add_the_handlers函数本意是想传递给每个事件处理器一个唯一值(i)但他没有达到目的,因为事件处理器函数绑定了变量i本身,而不是函数在构造时的变量i的值。就是说在循环外边的那个i污染了循环内的变量i。这是JavaScript的一个检测变量的机制,它会先从最外层的变量开始检测,所以当最外层的i变成了节点的个数的时候,打印出来的自然是总个数。

现在让我们改良这段代码

我们可以现在循环外面先创建一个辅助函数,让这个辅助函数再返回一个绑定了当前i值得函数,如此一来,辅助函数的形参i就不再是那个循环的i了,不会再造成变量污染,也不会混淆了。
tip: 我们需要避免在循环中创建函数,它只可能带来无谓的计算

级联

为什么要用级联,jQuery简洁么?链式操作爽么?那么就用级联吧。级联技术可以产生极富表现力的接口。
它的核心就是让一个方法返回值为this即可。

继承

伪类

JavaScript是一门弱类型语言,但它的某些复杂的语法看起来就像那些基于类的语言,这些语法问题掩盖了它的原型机制。它不直接让对象从其他对象继承,而是插入了一个中间层,通过构造器函数来产生对象。

当采用构造器调用模式,即用new前缀去调用一个函数的时候,函数执行的方式会被修改

定义一个构造器并扩充它的原型:

Person.prototype.get_name = function () {
return this.name
}

Person.prototype.says = function () {
return this.saying || ''
}

构造实例:

现在可以构造另一个伪类来继承Person,这是通过定义它的constructor函数并替换它的prototype一个Person实例来实现的:

一个函数对象被创建时,Function构造器产生的函数对象会运行类似这样的一些代码
this.prototype = { constructor: this }
函数对象被赋予一个prototype属性,它的值是一个包含constructor属性属性值为该新函数的对象。这个prototype对象是存放继承特征的地方。

替换Friend.prototype一个新的Person实例
Friend.prototype = newPerson ()

扩充新原型对象,增加get_name方法

var Hasik1 = new Friend('Trevor')
var says = Hasik1.says()
var name = Hasik1.get_name() // Hasik Trevor Hasik1</code></pre>

代码很丑,让我们来通过使用method方法来定义一个inherits方法实现:

由于methodinherits返回值都为this,所以我们可以使用级联。

通过隐藏一些prototype操作,使得代码更加优雅。但是仔细观察,你会发现一些问题:

解决方法:约定所有的构造器函数命名成首字母大写的形式,并且不以首字母大写的形式拼写其他东西。

原型

在JavaScript中,基于原型的继承比基于类的继承更为简单:一个对象可以继承一个旧对象的属性

构造一个对象:

现在有了一个对象,就可以使用Object.creat方法来构造更多的实例:

理解起来很简单,先克隆,再定制...

未完待续

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...