1.本地对象:Array,function,date,RegExp等,浏览器对象,HTMLDocument等(host对象,也称为本地对象
2.除了string,Number,boolean,null,undefined之外的称为Object。ES5里面可以忽略最后的逗号,ES3大部分都会忽略,但是IE里面会报错。ES5里面要求name加引号。
推荐对象的写法:name和value都加上引号,尾部的逗号去掉
3.创建对象的2种方式
1)直接写{} 2)使用new:new后面跟对象(),这样会调用对象的构造函数创建一个对象
4.使用new创建创建一个对象,构造函数会使用prototype值作为该对象的原型。例如new Array()就会使用Array.prototype作为原型。Object.prototype是一个特殊的对象,它没有原型,它不继承任何属性或方法。所有的对象继承Object的原型。所以当我们创建一个new Array(),会同时继承Array.prototype和Object.prototype。原型与原型之间的联系成为原型链
5.ECMAScript5定义了方法来创建对象:Object.create(), var obj=Object.create({"x":"1","y":"2"});obj会继承里面的属性,如果Object.create(null),那不会继承任何属性。如果想实现和{},new Object()一样的效果,可以Object.create(Object.prototype);
6.(ES5)使用Object.getPrototypeOf(obj)可以查询任何对象的原型,对象的构造函数constructor下面有一个属性prototype指定其具体的原型。Object.create()里面的第一个参数作为创建对象的原型。
7.对象的class属性是一个字符串,但是目前没有可以直接设置和获取的途径,只能间接获取对象类型。使用Object.prototype.toString.call(obj).slice(8,-1);这里提取一个通用的方法如下:
function classof(o) { if (o === null) return "Null"; if (o === undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8, -1); }
8.对象是否可扩展属性extensible:能否向一个对象添加新的属性。默认情况下所有的对象都是可扩展的。
判断一个对象是否可扩展:Object.isExtensible(obj)。设置一个对象不可扩展:Object.preventExtensions(obj)
1)Object.seal(obj):当前对象不可扩展,配置,删除。判断用:Object.isSealed(obj)
2)Object.freeze(obj):封闭程度更深,不可扩展,不可配置,不可删除,不可修改,只能读取。判断用:Object.isFrozen(obj)
9.对象序列化:把Object转换为string,并且可以反序列string到Object。ES5里面提供了两个对应的方法——①序列化JSON.stringify(obj),②反序列JSON.parse(obj)。向后兼容可以引入一个json2.js. 把对象序列化为json字符串的过程中,这些属性NaN,Infinity,-Infinity会被转换为null。Date会被转换为ISO格式。如果碰到不能被序列化的属性,则忽略。
10.Object涉及的方法:hasOwnProperty(), propertyIsEnumerable(), isPrototypeOf(), Object.create(), Object.getPrototypeOf()
1)toString():Object.prototype里面的这个方法没什么太多作用。常常会被其他的对象来重写。比如Array.toString,Date.toString(),Function.toString().
2)toLocalString():返回一个对象的本地string
3)toJSON():不是定义在Object.prototype上的方法,JSON.stringify()会寻找被序列化对象上的这个方法,如果有则调用。
4)valueOf():Object转换为基本类型时调用