实际上在JS里并不是如你所想(我开始是这么想的)那样,对象或直接称为object,实际上只是一些映射对的集合,像Map,字典等概念。JS里有大概7种类型(加上Symbol),数字、字符串、null、undefined、布尔、Symbol、对象。除对象以外的其他类型属于原始类型,就是说它们比较单纯,包含的东西比较少,基本上就是字面量所表示的那些(像C语言中的一些类型,就是占那么多空间,没有其他的东西)。object基本上是一些键值对的集合,属于引用类型,即是有一个名字去指向它来供别人使用的,就好像比较重的东西你拿不动,而只是拿了张记录东西所在地的纸条。所以当A对象里嵌套了B对象,仅表示A里面有一个引用指向了B,并不是真正把B包含在A里面,虽然看起来是这样(尤其是从对象的字面量上来看),所以才会有所谓的深拷贝与浅拷贝。
有句话叫“JavaScript里一切皆对象”,是因为在很多情况下原始类型会被自动的转为对象,而函数实际上也是对象,这样这句话看起来就很有道理了。
说明对象的本质是为了正确地认识对象,因为这关系到后面的理解。
对象的字面量 var obj = {}
创建实例对象 var obj = new Object()
原型模式:function clock(hour){} fn.prototype.hour = 0new clock()首先,每个函数都有一个prototype(原型)属性,这个指针指向的就是clock.prototype对象。而这个原型对象在默认的时候有一个属性constructor,指向clock,这个属性可读可写。而当我们在实例化一个对象的时候,实例newClock除了具有构造函数定义的属性和方法外(注意,只是构造函数中的),还有一个指向构造函数的原型的指针,ECMAScript管叫[prototype]],这样实例化对象的时候,原型对象的方法并没有在某个具体的实例中,因为原型没有被实例。
构造函数模式 function fn(){} , new fn()
工厂模式:用一个函数,通过传递参数返回对象。function fn(params){var obj =new Object()obj.params = paramsreturn obj},fn(params)
推荐两本javascript面向对象的编程书籍:《面向对象的Javascript》(Object-Oriented JavaScript)
《Javascript高级程序设计(第二版)》(Professional JavaScript for Web Developers, 2nd Edition)
关于javascript的其他书籍,找了资料分享一下:
入门级,也适合想掌握一些前端技能的非前端工程师.
<JavaScript Dom编程艺术>
成为一名合格的前端工程师
<JavaScript高级程序设计>(或<JavaScript权威指南>)
<精通JavaScript>
更优秀的代码,更优良的设计
<JavaScript语言精粹>
<JavaScript设计模式>
从语言细节到复杂工程实践,想开发靠谱的各类底层代码,应该看看
<Secrets of the JavaScript Ninja>
<JavaScript Patterns>
<ECMA-262 in Detail>
应该重视跟踪阅读一些大牛们的Blog了
一直在等待:<一本JavaScript语言作者或引擎实现者写的书>
各类专题书籍,读好第二批次书籍之后,有精力就接触下
<高性能网站建设指南>
<高性能网站建设进阶指南>
<高性能JavaScript>
<Ajax实战>
<JQuery实战>
<精通CSS>(或<CSS权威指南>)
<正则表达式必知必会>(或<正则表达式权威指南>)
应该选择:<一本HTML5方面的书>
应该选择:<一本NodeJS方面的书>
最后的叮嘱:
学习要循序渐进,一步一个脚印,如果想学,不是买了书就完了,要认真看!