1. 定义
对象是JavaScript的一种数据类型,它是属性的无序集合,而且js中一切皆对象。
2. 创建
可以通过以下几种方式创建对象:
1. 对象字面量(也叫对象直接量):
2. 构造函数:
I: 系统定义的构造函数创建:Object,String,Number,Boolean等
II: 自定义的构造函数:
自定义的构造函数即为一个函数,为了与普通函数区别,采用大驼峰式(单词首字符都大写)命名法命名函数。
III: Object.create(原型对象)
该方法创建对象时,传递需要创建的对象的原型,创建一个新的对象。它有如下特性:
1. 传递的原型对象必须为Object或null,不传或传其他的原始数据类型时都会报错;
2. 当传递null时,表示创建的对象没有原型;
3. Object.create(Object.prototype) 等价于 new Object()。
3. 包装类
五大原始值:string,number,boolean,null,undefined,其中string,number,boolean都有自己的包装类。有了包装类,我们可以给这些原始值添加属性和方法及获取它们包装类的属性和方法。如下,我们可以直接获取字符串的length数据:
当我们在访问字符串'abc'的length属性时,js引擎内部帮我们做了这样的处理:new String('abc').length;但是需要注意的是,该操作是临时的,在创建完string对象并获取length属性后,创建的对象会立即销毁。所以我们会得到下面的结果:
4. 原型
原型(prototype)是function对象的一个属性,它是构造函数构造出来的对象的公共祖先,它也是一个对象。通过构造函数构造的对象,可以访问该对象原型上的属性:
通过自定义的构造函数创建对象时,用了new操作符,该操作符在创建对象时,内部做了如下的隐性操作:
上图中的描述,可以得到如下的结论:
1. 可以构建自己的对象,并返回:
但是需要注意的是,返回原始值是无效的:
2. 可以看出,在创建对象时,第一步隐式操作就已经得到了该对象,后面给该赋值,并返回。如下,我们可以通过instanceof操作符判断this对象为Person的实例:
3. 创建的对象中包含了一个__proto__的属性,该属性即为对象的原型,可以通过修改该属性,改变对象的原型(但最好不要这样做,一般通过设置Person.prototype的方式改变对象的原型):
原型也是一个对象,它的上面有一个constructor属性,该属性指向了对象的构造器,通过该属性可以找到创建出的对象的构造函数,可以通过对象.constructor方式访问:
5. 原型链
原型对象也是一个对象,那么它也有自己的原型,这样就会形成一个原型链。创建的对象可以访问原型链上的所有属性和方法:
大部分对象的原型链的最顶端是Object.prototype,仅Object.create(null)创建的对象除外,它没有原型。dom中有一个document.write()方法,该方法在输出时会调用toString方法,当遇到Object.create(null)创建的对象时,它在输出时会报错,因为它没有toString()方法:
Object.prototype对象包含的属性如下图:
网友评论