对象的对象特性
- 对象的原型,指向另一个对象,本对象的属性继承自他的原型对象
- 对象的类,标识一个对象类型的字符串
- 对象的扩展标记,指明是否可以向该对象添加新属性
创建对象
- 对象直接量
对象直接量是一个表达式,这个表达式的每次运算都会创建并初始化一个新的对象。 - 通过new创建
- 原型
- Object.create()创建(es5)
var o1 = Object.create({x:1,y:2}) // o1继承了属性x和y
console.log(o1.x) // 1
若传入null,则创建一个没有原型的对象
继承
假设要查询对象o的属性x,如果o中不存在x,那么将会在o的原型对象中查询属性x,如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象上执行查询,直到找到x或者查到一个原型是null的对象为止。(原型链)
function inherit(o){
if (o == null) throw TypeError()
if (Object.create) {
return Object.create(o)
}
var t = typeof o
if ( t == 'object' && t !== 'function' ) throw TypeError
function f(){}
f.prototype = o
return new f()
}
删除属性
delete运算符只是断开属性和宿主对象的联系,而不是去操作属性中的属性。只能删除自有属性,不能删除继承属性。
检测属性
- in运算符
- hasOwnProperty() 属性是否是自由属性,继承属性返回false
- propertyIsEnumerable() 是自由属性并且是可以枚举的
枚举属性
对象继承的内置方法是不可以枚举的,但是在代码中给对象添加的属性都是可以枚举的
用for/in可以遍历枚举属性
- Object.keys() 返回一个数组,是由对象中可枚举的自有属性的名称组成。
- Object.getOwnPropeytyNames() 返回对象的所有自有属性的名称
setter 和 getter
es5中,对象的属性可以用一个或两个方法代替,就是getter和getter。由 getter和setter定义的属性称为“存储器属性”。他不同于数据属性,数据属性只是一个简单的值。
var o = {
// 普通的数据属性
data_prop: value,
// 存储器属性都是成对定义的函数
get accessor_prop() { },
set accessor_prop() { }
}
存储器属性也是可以继承的
属性的特性
- 数据属性的特性:值,可写性,可枚举,可配置
- 存储器属性的特性:读取,写入,可枚举性和可配置性
利用 Object.getOwnPropertyDescriptor()可以获取属性描述符的对象(自有属性的)
设置属性的特性:
Object.defineProperty()
var 0 = {}
Object.defineProperty(o,"x",{
vaule: 1,
writable: true,
enumerable: false,
configurable: true
})
设置多个属性特性:
var p = Object.defineProperties,{
x: { value: 1, writable: true,... }
// 存储器属性
r : {
get: function() { return ... }
enumberable: true,
...
}
})
网友评论