javascript原生提供Object对象,所有其他对象都继承自这个对象,Object对象本身也是一个构造函数,可以通过它来生成新的对象。
Object作为构造函数使用时,可以接受一个参数。分为对象和原始类型的值两种:
- 如果是对象,就直接返回这个对象。
- 如果是原始类型的值,就返回该值对应的包装对象。
- 如果没有传入参数,则和
{}
等价。
对象的原型属性 prototype
所有构造函数都有一个prototype属性,指向一个原型对象。凡是定义在Object.prototype对象上面的属性和方法,将被所有实例对象共享。
1 | Object.prototype.print = function(){ console.log(this)}; |
在Object.prototype上定义了方法print,然后生成了Object的实例o,o直接继承了Object.prototype的属性和方法,可以在自身调用它们,也就是说,o.print
实际调用了Object.prototype.print
方法。即,这个print是实例对象的方法
静态方法
所谓静态方法,是指部署在Object对象自身的方法,调用方式为Object.funs()
。
自定义静态方法
定义在构造函数上的方法
1 | function People (name, age) { |
常用的Object的方法
Object.keys()
用来遍历对象的属性。参数为对象,返回为属性名的数组。Object.keys方法只返回可枚举的属性。
1 | var tony = new People('tony', 24); |
其实,对象tony可以表示为这样:
1 | var tony = { |
当参数为数组时,返回数组的索引:
1 | var arr = [3, 4, 5]; |
Object.getOwnPropertyNames()
这个方法和Object.keys()
方法和相似,区别是Object.keys
只返回可枚举的属性,但是Object.getOwnPropertyNames()
返回所有属性,包括不可枚举的属性:
1 | var arr = [3, 4, 5]; |
Object对象的实例方法
除了Object对象本身的方法,还有不少是部署在Object.prototpye
对象上的,所有Object的实例对象都继承了这些方法。常用的Object实例对象的方法,主要有以下六个:
valueOf()
返回当前对象对应的值toString()
返回当前对象对应的字符串形式toLocaleString()
返回当前对象对应的本地字符串的形式。hasOwnProperty()
判断某个属性是否为当前对象对象自身的属性,还是继承自原型对象的属性。isPrototypeOf()
判断当前对象是否为另一个对象的原型。propertyIsEnumberAble()
判断某个属性是否可以枚举。
Object.prototype.valueOf()
valueOf方法的作用是返回一个对象的值,默认情况下返回对象本身。主要用途是,javascript自动类型转换时会默认调用这个方法。
回忆类型转换:对象的转换规则,先调用自身的valueOf方法,如果放回的是对象,就调用toString方法,如果是原始类型的值,就直接使用Number方法。
可以重新定义valueOf方法,使转换的时候得到期望的值
1 | tony.valueOf = function() { |
Object.prototype.toString()
toString的作用是返回一个对象的字符串形式,默认情况下返回类型字符串"[Object Object]"
.
值得注意的是,当数组调用toString方法时,返回的为数组的值构成的字符串,但是如果数组内部有对象时,对象部分还是会返回"[Object Object]"
。
1 | var arr= [3, 4, 5, [3, 4, 5]]; |
属性描述对象
javascript提供了一个内部的数据结构,用来描述一个对象的属性的行为,以及去控制它的行为。被称为属性描述对象(attribute object),下面是一个实例:
1 | { |
Object.getOwnPropertyDescriptor()
该方法可以读取出对象自身某属性的描述对象,参数为:Object.getOwnPropertyDescriptor(object, propertyName)
1 | console.log(Object.getOwnPropertyDescriptor(tony, 'name'));//Object { value: "tony", writable: true, enumerable: true, configurable: true } |
Object.defineProperty()/defineProperties()
defineProperty方法允许通过定义属性描述对象,来定义或修改一个属性,调用方式为:Object.defineProperty(object, propertyName, attributesObject);
,如果该属性不存在,就给对象定义一个属性,如果存在,就是修改属性的描述对象。
1 | Object.defineProperty(tony, 'name', {enumerable: false}); |
上述代码的目的是,将tony对象的属性name修改为不可枚举的,导致Object.keys()
方法无法获得name
属性。Object.defineProperties()
方法是一次定义或修改多个属性,调用方式为:
1 | Object.defineProperties(object, { |