对象是javaScript的基本数据类型,对象可以看成多属性的无序集合,每个属性都是一个名/值对。也可以将对象看成从字符串到值的映射。因为属性名是字符串。
对象的创建 new 或者 Object.create()函数
prototype:原型。
所有的通过对象直接量创建的对象都具有同一个原型对象。并且可以通过Object.prototype 获得对原型对象的引用。
//传入所需的原型对象。
var o1=Object.create({x:1,y:2});
//创建一个空对象
var o2=Object.create(null);//o2不继承任何的属性和方法,比如toString()
//创建一个普通的空对象,就需要传入原型,Object.prototype;
var o3=Object.create(Obejcet.prototype); 这时候和{} 和new Object()一样。
var o={} //o从Object.prototype继承对象的方法
o.x=1 //给o定义有一个属性x ,如果o有x属性,那么就是给他重新赋值,否则的话,就是重新添加新的属性。
var p=inherit(o) ;//p继承o和Obeject.prototype 这里的inherit()方法中不能传入null,这样的话就能继承Object的原型 并且能够继承对象o的x的属性。
如果对象的属性不存在的话 那么就返回undefined
使用delete的时候,只能删除自有属性,但是不能删除继承属性。
判断某个属性是否存在某个对象中,可以用in运算符,hasOwnPreperty()和propertyIsEnumerable()方法完成这个工作。
var o={x:1};
o.hasOwnProperty("x"); //true 但是对于继承属性 返回false
"x" in o //true 包括继承的属性
o.propertyIsEnumerable("x");//true 这是是hasOwnProperty("x")的加强版
o.x!==undefined //true 这证明o中有属性x
但是如果定义的var o={o:undefined}
这时候只能用"x" in o来进行判断。
这里使用的!==null 因为如果是使用的!= 这时候必须判断x的值不为null 或undifined
//进行遍历对象的属性。使用for /in 循环遍历
var o = {
//普通的数据属性
data_prop: "",
//使用get set 这样的标记,就能直接把方法当做属性进行使用
get accessor_prop() {
return this.data_prop
}, //这里不用;分割,而是选择使用,分割两个方法
set accessor_prop(value) {
this.data_prop = value
}
}
console.log(o.accessor_prop)
o.accessor_prop="eee"
console.log(o.accessor_prop)
继承的写法
创建对象的时候 如果在属性中有$表示的就是私有的属性。
创建对象中可以有多个get方法
可以通过Object.getOwnPropertyDescriptor({x:1},"x");
来获取到某个对象的特定属性的描述。但是只能获取到自身属性的描述符。想要获取到继承的属性的特性,需要遍历原型链。getProtorypeOf()
要想设置属性的特性,或者想让新建的属性具有某个特性,需要调用Object.definePeoperty(),传入要修改的对象/创建或修改的属性的名称以及属性的描述符对象。
但是如果想同时创建多个属性。就要使用Object.defineProperties()
数据属性的描述对象的属性 有value. writable enumerable configurable
我们调用get set方法的时候直接像调用属性一样 就可以实现方法的调用。 这里提供get set 方法的目的 就是为了实现自定义方法的效果。
var o={};//创建一个空的对象
//添加一个不可枚举的数据属性x 并赋值、
Object.defineProperty(o,"x",{
value:1,
writable:true.
enumerable:false,
configurable:true
});
因为是不可枚举的类型,那么 就调用Object.keys(o);//[]
这是定义一个get方法
Object.defineProperty(o,"x",{get:function(){return 0;}})
使用extend()函数,这个函数是把一个对象的属性复制到另一个对象中。仅仅是复制属性名和值,没有复制属性的特性。也没有复制getter setter方法
对象的三个属性
原型(prototype) 类(class) 可扩展性(extensible attribute)
通过Object.create()创建的对象包含一个Constructor的属性,这个属性指代Object()构造函数。因此constructor.prototype才是对象直接量的真正原型。
//使用isPrototypeOf()
var p={x:1};
var o=Object.create(p);//这是以p为原型创建o的对象
p.isProtoTypeOf(o) //true
Object.prototype.isPrototypeOf(o)//true :p继承自Object.prototype
通过classof()方法能够确定传入参数的类型
classof(null) //null
classof(1) //Number
对象的可扩展性 表示是否可以给对象添加新属性
Object.isExtensible(),//来判断该对象是否是可扩展的
如果想将对象转化为不可扩展的 需要调用object.preventEctensions()
但是一旦将对象转换为不可扩展的,就无法再转换为可扩展的了。
Object.seal() 和Object.preventEctensions()类似,除了能够将对象设置为不可扩展的,还可以将对对象的所有的自有属性设置为不可配置的。
可以通过Object.isSealed()来检测对象是否封闭
Object.freeze() 更严格的锁定对象。 Object.isFrozen() 检测
//创建一个封闭对象,包括一个冻结的原型,和一个不可枚举的属性
var o=Object.seal(Objecet.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));
对象的序列化:是将对象的状态转换为字符串。也可以将字符串还原为对象。
提供了JSON.stringify() 和JSON.parse()来序列化和还原javaScript对象
JSON.stringify() 只能序列化对象可枚举的自有属性。对于不能序列化的属性,在序列化的输出字符串中会将这个属性省略。
toString()方法,默认的情况携带的信息比较少,比如var s={x:1,y:1}.toString();//[object,object] 因此要进行重写toString()方法
对象都包括toLocaleString() 方法,这个方法返回的一个表示对象的本地化字符串。默认的toLocaleString()方法仅仅调用了toString()方法并返回。