修改对象
创建对象只是使用ECMAScript的乐趣的一部分。你喜欢修改已有对象的行为吗?
这在ECMAScript中是完全可能的,所以可为String、Array、Number或其他任意一种对象设计出你想要的任何方法,因为有无限的可能性。
还记得本章前面的小节中介绍的prototype属性吗?
你已经知道,每个构造函数都有个prototype属性,可用于定义方法。
你还不知道的是,在ECMAScript中,每个本地对象也有个用法完全相同的prototype属性。
1 创建新方法
可以用prototype属性为任何已有的类定义新方法,就像处理自己的类一样。
最后,如果想给ECMAScript中的每个本地对象添加新方法,必须在Object对象的prototype属性上定义它。
如上一章所述,所有本地对象都继承了Object对象,所以对Object对象做任何改变,都会反应在所有本地对象中。
2 重定义已有方法
第2章中介绍过Function的toString()方法通常输出的是函数的源代码。
覆盖该方法,可以返回另一个字符串(在这个例子中,返回"Function code hidden")。
不过,toString()指向的原始函数怎样了呢?
它将被无用存储单元回收程序回收,
因为它被完全废弃了。没能够恢复原始函数的办法,
所以在覆盖原始方法前,存储它的指针比较安全,以便以后的使用。
你甚至可能在某种情况下在新方法中调用原始方法:
Function.prototype.originalToString = Function.prototype.toString;
Function.prototype.toString = function(){
if(this.originalToString().length > 100){
return "Function too long to display.";
} else {
return this.originalToString();
}
};
在这段代码中,第一行代码把对当前toString()方法的引用保存在属性originalTo- String中。
然后用定制的方法覆盖了toString()方法。
新方法将检查该函数源代码的长度是否大于100。如果是,就返回错误消息,说明该函数代码太长,
否则调用originalToString()方法,返回函数的源代码。
3 极晚绑定
从技术上来说,根本不存在极晚绑定。
本书采用该术语描述ECMAScript中的一种现象,
即能够在对象实例化后再定义它的方法。
var o = new Object();
Object.prototype.sayHi = function(){
alert("hi");
};
o.sayHi()j;
在大多数程序设计语言中,必须在实例化对象之前定义对象的方法。
这里,方法sayHi()是在创建Object类的一个实例后才添加进来的。
在传统语言中不仅没听说过这种操作,也没听说过该方法还会自动赋予Object的实例并能立即使用(接下来的一行)。
不建议使用极晚绑定方法,因为很难对其跟踪和记录。
不过,还是应该了解这种可能。
前面的总结
ECMAScript语言为JavaScript实现提供了完整的面向对象语言能力。
在这一章中,学到了ECMA-262中定义的三种不同类型的对象:本地对象、内置对象和宿主对象。
探讨了Array对象和Date对象,学习了它们的方法、属性及各种古怪之处。
此外还学习了两个内置对象,即Global和Math对象,并了解了Global对象与其他对象的区别。
这一章还介绍了完全定义自己的对象的能力,其中探讨了几种实现该能力的方法,讨论了它们的优点及缺点。
最后,学习了如何修改已有对象,加入新的方法或覆盖已有的方法。
分享到:
相关推荐
《JavaScript高级程序设计》是JavaScript开发者的经典教材,它深入探讨了这门语言的核心概念和技术。这篇读书笔记主要聚焦在第三部分,这部分通常涵盖了更高级的主题,如对象、原型、闭包以及模块化等。结合提供的...
### HTML5高级程序设计学习笔记 #### 一、HTML5新增结构标签 在HTML5中,为了更好地组织页面内容并增强语义性,引入了一系列新的结构标签,这些标签不仅能够帮助开发者更清晰地定义页面的不同部分,同时也为搜索...
在《JavaScript高级程序设计》中,对ECMAScript中引用类型的相关知识点进行了详细阐述。引用类型在JavaScript中是非常重要的概念,它们相较于原始类型而言,在内存中占有较大的比重,并且其行为也更为复杂。以下是对...
Window对象 窗口操作 Window对象对操作浏览器窗口非常有用,开发者可以移动或调整浏览器窗口的大小。可用四种方法实现这些操作: moveBy(dx,dy):把浏览器窗口相对当前位置水平移动dx个像素,垂直移动dy个像素。...
JavaScript中的继承机制是其面向对象编程的关键特性,允许一个对象或类从另一个对象或类获取并复用属性和方法。本文将深入探讨JavaScript中的五种主要继承实现方式:对象冒充、call()、apply()、原型链以及混合方式...
JavaScript 中定义类或对象的方式 JavaScript 中定义类或对象有多种方式,包括工厂方式、构造函数方式、原型方式、混合的构造函数/原型方式和动态原型方法。 工厂方式是通过创建并返回特定类型的对象的函数来定义...
JavaScript中的Function类是一种特殊的数据类型,它可以用来动态创建或表示任何开发者定义的函数。通过`new Function()`构造函数,我们可以传递参数列表和函数体来创建一个新的函数。例如,`var sayHi = new ...
JavaScript,作为一种广泛应用于Web开发的脚本语言,其核心规则和规范由ECMAScript标准定义。ECMA-262是这个标准的正式名称,它详细规定了JavaScript的语法、类型、关键字、保留字、操作符以及对象。ECMAScript为...
### JavaScript高级程序设计读书笔记之九:本地对象Array #### 创建Array对象 在JavaScript中,`Array`是一种非常重要的本地对象,主要用于存储一系列有序的数据。创建`Array`对象的方法有多种,具体包括: 1. **...
### JavaScript高级程序设计阅读笔记(七):ECMAScript中的语句 #### 一、引言 本篇文章基于《JavaScript高级程序设计》一书第七章的内容进行总结与扩展,主要探讨了ECMAScript中的各种语句类型及其用法。通过...
在JavaScript中,内置对象是指由ECMAScript标准实现并提供的一类特殊对象,它们独立于宿主环境(例如浏览器或Node.js环境)存在,并在程序执行时自动创建。这些对象提供了许多基本功能和常用方法,使得开发者可以...
JavaScript高级程序设计中的第十七章主要探讨了JS事件的相关概念和处理机制。事件流、事件处理函数以及事件对象是这一章的核心内容。 **事件流**是指事件在DOM(文档对象模型)中传播的方式。在IE中,事件流采用的...
### JavaScript中的Date对象详解 #### 一、概述 在JavaScript编程语言中,`Date`对象是一种内置对象,用于处理日期和时间数据。它提供了一系列的方法和属性,可以帮助开发者轻松地进行日期时间的操作,如获取当前...