对象直接量:
使用对象直接量的方式创建对象是非常直观的。对象直接量如果被重复调用,会创建许多对象,如下:
function createObj() {
var o = {
x: 1
};
return o;
}
var o1 = createObj();
var o2 = createObj();
console.log(o1 == o2);
console.log(o1 === o2);
false
false
由此可见,重复调用对象直接量的代码会创建多个不同的对象。
new:
除了上面提到的通过对象直接量的方式创建对象以外,还可以通过new + function的形式来创建对象,例如:new Array();、new Date();等。
这里的Array和Date就是function,这样的function称作构造函数。
一般情况下,通过new创建的对象继承其构造函数的prototype对象的属性,故new Array 继承自Array.prototype,new Date 继承自Date.prototype(关于原型的更详细的内容将在后面介绍)。
Object.create():
Object.create()的功能类似于new,不同之处在于Object.create()方法可以自己指定需要继承的原型对象。如:
var o = {};
var o1 = Object.create(Object.prototype);
console.log(o == o1);
console.log(o === o1);
false
false
这里字面量创建的空对象{}实际上等同于Object.create(Object.prototype)。
另外,Object.create()还可以给对象添加属性描述(Object.definePropery是为已存在的对象添加属性描述),就我个人理解,就是给对象添加一些属性以限制对象的行为(Object.create略):
var o = {};
Object.defineProperty(o, 'name', {
writable: true,
enumerable: false,
configurable: true,
value: 'hello'
});
console.log(o.name);
console.log(Object.keys(o));
hello
[contain: function]
如果将enumerable改为true,这里结果将包含name属性,由此可见enumerable控制了属性的可枚举性。
同理,writable控制属性的可写性。而configurable控制属性的可配置性,也就是说如果将configurable配置为false,那么之后不能再使用Object.defineProperty或Object.defineProperties修改已有属性了。