文章目录
- 创建对象
- 使用hasOwnProperty验证对象属性是否来自原型链
- Object()
- Function()
- head/全局对象
- this
- prototype属性
- 原型
创建对象
字面量
对象是键值对的集合,那么我们在声明一个对象的时候,可以通过字面量的形式来声明对象:
valueObject的类型为:object
valueObject的构造函数为:Object
Object构造函数
通过new Object来声明一个对象:
自定义构造函数
先自定义个构造函数:
通过new Person来声明对象:
JavaScript内置的对象构造函数
除了我们自定义的构造函数以外,JavaScript有9个内置的对象构造函数:Number、String、Boolean、Object、Array、Function、Date、RegExp、Error
Math是一个静态对象,不是构造函数,Math作为JavaScript设置的对象命名空间,用来存储数学函数。
当试图访问一个对象的属性时,它会检查该属性的对象实例,如果实例拥有该对象属性,就返回该属性,如果没有,JavaScript会在对象的构造函数prototype对象上查找。
所有对象实例都有一个属性,连接到创建实例的构造函数【proto】
使用hasOwnProperty验证对象属性是否来自原型链
通过in
操作符可以验证一个对象的属性【包括来自原型链的属性】,hasOwnProperty方法可以检查来自非原型链属性的对象。
for in
循环遍历对象属性,但是它不仅遍历本身属性,也遍历继承的对象上的属性,那么只能在循环内使用hasOwnProperty()
方法来判断是属性是否是非原型链上的属性。
Object()
可以使用Object()构造函数来创建动态的普通对象。
Object()的属性:constructor
Object()的方法:hasOwnProperty()、isPrototypeOf()、propertyIsEnumerable()、 toLocaleString()、toString()、valueOf()
原型链以Object.prototype结尾,所以Object()的所有属性和方法被所有对象继承。
所有对象都继承自Object.prototype:
Function()
属性:prototype
实例的属性:arguments、constructor、length
实例的方法:apply()、call()、toString()
head/全局对象
JavaScript代码在浏览器中执行时,会被包含在window对象内,window对象就是全局对象。全局对象是JavaScript环境中可用的最高的作用域。
this
创建函数的时候,会自动创建一个this,它指向的是函数的调用者
prototype属性
原生的构造函数【Object()、Array()、Function()等】使用了prototype属性,方便构造函数的实例继承属性和方法。
原型
原型是一个对象,原型链把实例连接到构造函数的prototype属性上。当使用new关键字来创建一个实例的时候,都会在实例和构造函数的prototype属性之间添加一个隐藏连接【proto】,例如:
因为prototype属性是一个对象,那么原型链或者查找中的最后一站是Object.prototype。例如:创建一个空数组,试图访问该数组上未定义的属性:
首先会查询原型链,如果没有找到foo属性,那么在Array.prototype中查找该属性,如果还是没有找到,则在Object.prototype上查找,最后在三个地方都没有找到的话,就返回undefined。
通过prototype属性,我们可以实现原型继承: