最近读了《JavaScript权威指南(第6版)》、《深入浅出Node.js》、《Node.js开发指南》三本书。

    《JavaScript权威指南(第6版)》是本不错的书,基本语法我基本没看,感觉都差不多,当然记住一些特别的约定,例如在C++的类方法中,使用实例属性不必使用this,而Javascript的方法中必须使用this;例如Javascript约定_开头的属性是私有属性。

    主要看Javascript的类部分。以前着重跟C++等强类型面向对象语言对比,认同Javascript是Everything is Object(一切皆是对象)。而实际上,从这方面讲,几乎对大部分脚本语言而言,都是Everything is Object。

    另一方面,Javascript没有"子类"和"父类"的概念,也没有"类"和"实例"的区分,全靠一种很奇特的"原型链"模式,来实现继承。据说原本不设计类而设计原型是为了简化,让初学者更加容易懂。但对于擅长C++这类面向对象语言的我而言,却反倒难理解,所以从大一写Javascript,学了至少两三次原型才理解。简单点解释,假如没有原型,Javascript每次创建一个实例都必须拷贝一次数据、属性、方法等等。这样浪费内存且效率低,所以把可复用部分放到了原型中,所有实例共享一个prototype对象,需要拷贝的部分放在构造函数等等中。这就是Javascript的封装方法。

    以前教师弟时说:Javascript是一种真正面向对象的语言,主要是因为一切皆是对象。但是从另一方面讲,他没有类这个概念,原型也只是为了某种方便而设计的,也不算是真的面向对象。当然讨论他是不是真正面向对象豪无意义。对于面向对象语言,必须谈谈如何继承。

    Javascript继承方法有两种:

    一是使用Apply。

    二是将利用一个空对象,将"子类"的prototype指向“父类”的prototype,继承两次。以此封装实现extend方法。

    读完突然想起一年前准备写一篇关于C++的对象模型的。。。留的坑到现在还没填。。改天抽空填坑。