每一个对象都有与之相关的原型(prototype),类(class)和可扩展性(extensible attribute).
原型属性
对象的原型属性是用来继承属性的.我们经常把对象的原型属性简称为对象的原型.
- 通过对象直接量创建的对象,它的原型是Object.prototype
- 通过new创建的对象,它的原型是构造函数原型
- 通过Object.create()创建的对象,它的原型是Object.create()接收的第一个参数(可以是null)
获取对象的原型属性
Object.getPrototypeOf()
检测一个对象是否在另一个对象的原型链中,使用
isPrototypeOf()
var p = {name:'Mike',age:18}
var p1 = Object.create(p)
p.isPrototypeOf(p1) //true
类属性
对象的类属性是一个字符串,表示对象的类型信息.但是ECMA5并未提供设置这个属性的方法,而且只能通过toString()并截取第8个到倒数第2个字符的方式间接的查询它.但很多对象的toString方法重写了,所以得调用Function.call()方法实现.以下函数可以获取class
//获取对象类属性的函数
function classof(o){
if(o===null) return 'Null'
if(o===undefined) return 'Undefined'
return Object.prototype.toString.call(o).slice(8,-1)
}
可扩展性
对象的可扩展性表示是否可以给对象添加新属性.所有的内置对象和自定义对象都是可扩展的,除非修改它们的可扩展属性.可扩展性的目的是将对象锁定,避免外界的干扰.
- 通过
Object.isExtensible()
判断对象是否可扩展 - 通过
Object.preventExtensions()
将对象设置为不可扩展.一旦对象设置为不可扩展的,就无法再转换为可扩展的.
preventExtensions()
只影响对象本身的可扩展性.如果给一个不可扩展的对象的原型添加属性,这个不可扩展对象同样会继承新添加的属性.
封闭对象
- 通过
Object.seal()
可以将对象设置为不可扩展,同时所有自有属性被设置为不可配置的.封闭后的对象不可再解封 - 通过
Object.isSealed()
可以检测对象是否被封闭
冻结对象
- 通过
Object.freeze()
可以将对象设置为不可扩展,属性设置为不可配置,数据属性设置为只读.(如果有存取器属性有setter,依然可以被赋值) - 通过
Object.isFrozen()
可以查询对象是否被冻结
Object.preventExtensions() Object.seal() Object.freeze()都返回传入的对象,所以可以嵌套使用.