在JavaScript中,一切都是对象或者可作为对象处理。
JavaScript内置对象:
1,本地对象(通过new实例化的):Object、Array、Date、RegExp、Function、Boolean、Number、String等
2,内置对象(自带,无需实例化):Global、Math、JSON
3,宿主对象(环境提供的):Window、Document
JavaScript你日志错误处理的结构函数(与throw连用):
1,Error()
2,SynteaxError()
3,TypeError()等
下面是对象所带来的一些思考:

上图带来了一个问题,以字面量形式构建对象和new形式构建对象的优劣是什么?表现在什么地方?具体的内部调用又有何区别?
JavaScript中的对象其实就键值对组成的散列表,即哈希表(简单理解就是通过了某种算法【散列函数*核心】将要检索的项和用于检索的索引关联起来,生成的一种便于搜索的数据结构),当然JavaScript中的散列表不存在所谓的散列冲突。对象的属性是随时可变的,我们不管定义的是字面量是内置对象还是仅仅一个“{ }”再添加各种属性,我们都建立了一系列的键值对。注意:就算我们创建了一个“{ }”对象,其实都会从Object.prototype继承属性,我们通常说的空,只是说没有自身的属性。
当我们使用Object()构造函数来创建对象的时候,解析器可能存在“从当前的作用域顺着作用域链直到Object()构造函数为止做查询”(考虑到你已经创建同名的构造函数),而字面量形式不需要做“作用域解析”的。new Object()/new Function()这样的操作都会去考虑这一点。
作用域链基本结构:
当前环境变量对象 >> 外部环境变量对象 >> ...... >> 全局环境变量对象

字面量形式优点1:

1,写法上字面量形式简易很多,想表达的属性也很清楚
字面量形式优点2(反证):

字面量形式优点3:

new形式创建对象时防止缺失new关键字

如果我们,没有在构造函数内自定义返回对象,当我们像图中这样调用的时候,就可能顺着作用域链去查找全局的name属性了,这是我们不想看到的。
解决方法:
1,使用严格模式
2,在ECMAScript5中,这里的this不再指向全局对象哟,也可以使用上述的return that的办法,当然带来的问题是继承的全部丢失
3,先判断this是否是构造函数的实例,不是就直接return一个新的自身对象

上述解决方法2代码实例
最后,希望能寻得信仰!各位道友有错或者其他代码情况或者不懂得一定要说出来,大家一起进步啦!(写的有错的地方一定要和我说!万分感谢!)
网友评论