`
hhr_michael
  • 浏览: 74332 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

JavaScript高级程序设计 (读书笔记8)

阅读更多
修改对象

创建对象只是使用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对象与其他对象的区别。


这一章还介绍了完全定义自己的对象的能力,其中探讨了几种实现该能力的方法,讨论了它们的优点及缺点。

最后,学习了如何修改已有对象,加入新的方法或覆盖已有的方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics