在JavaScript中,我们可以使用内置的`Object()`构造函数来动态创建通用的空对象。当我们首次接触编程时,可能就用它创建了名为`cody`的对象。让我们重温一下这个过程:
“`htML
var Cody = new Object(); // 创建一个没有任何属性的空对象
for (key in Cody) {
// 确认Cody是一个空的通用对象
if (Cody.hasOwnProperty(key)) {
console.log(key); // 应该不会有任何输出,因为Cody自身没有属性
}
}
“`
`Object()`构造函数就像一个工具,用于创建不具备预定义属性或方法的空对象(当然,继承自原型链的除外)。请注意,`Object()`本身也是一个对象,它基于函数构造函数创建。虽然这可能有些混淆,但要明白`Object()`构造函数只是抛出一个空对象。你可以创建任意多的空对象,但这与创建拥有预定义属性的自定义构造函数(如`Person()`, 类似于`Object()`)有很大区别。
要充分利用JavaScript的能力,不仅要学会如何用`Object()`创建空对象容器,还要掌握构建自己的对象“类”。`Object()`构造函数的参数:
`Object()`构造函数接受一个可选参数,这个参数将用于创建对象的值。如果没有提供参数,那么值会被认为是空的或未定义的。
“`html
// 创建空对象
var cody1 = new Object();
var cody2 = new Object(undefined);
var cody3 = new Object(null);
console.log(typeof cody1, typeof cody2, typeof cody3); // 输出 “object object object”
“`
如果传递给`Object()`的参数不是`null`或`undefined`,那么这个值会被转化为一个对象。理论上,我们可以使用`Object()`构造函数创建任何其他内置对象,比如在下面的例子中:
“`html
/* 使用Object()构造函数创建字符串、数字、数组、函数、布尔和正则表达式对象 */
// 下面的输出证明了这是可行的
console.log(new Object(‘foo’));
console.log(new Object(1));
console.log(new Object([]));
console.log(new Object(function() {}));
console.log(new Object(true));
console.log(new Object(/\b[a-z]+\b/));
// 但实际上,用Object()构造函数创建这些对象实例并不常见
“`
`Object()`的属性和方法:
`Object()`对象有一些特有的属性(不包括继承的属性和方法):
– `Object.prototype`: 原型对象
`Object()`实例具有的属性和方法(不包括继承的):
– `constructor`: 构造函数
– `toString()`: 转换为字符串
– `hasOwnProperty()`: 检查对象是否包含指定的自有属性
– `isPrototypeOf()`: 检查对象是否在另一个对象的原型链中
– `propertyIsEnumerable()`: 检查属性是否可枚举
– `toLocaleString()`: 返回本地化的字符串表示
– `toString()`: 转换为字符串
– `valueOf()`: 返回对象的原始值
所有JavaScript对象的原型链最终都指向`Object.prototype`,这意味着`Object()`的所有属性和方法都会被继承。
创建对象字面量:
创建对象通常使用大括号来表示,可以包含或不包含属性。在第一章,我们创建了`cody`对象并使用点表示法赋予它属性。让我们再做一次:
“`html
var Cody = new Object();
Cody.living = true;
Cody.age = 33;
Cody.gender = ‘male’;
Cody.getGender = function() { return Cody.gender; };
console.log(Cody); // 输出cody对象及其属性
“`
使用对象字面量,我们可以更简洁地创建相同对象:
“`html
var cody = {
living: true,
age: 23,
gender: ‘male’,
getGender: function() { return Cody.gender; }
}; // 注意最后一个属性后面没有逗号
console.log(Cody); // 输出cody对象及其属性
“`
对象字面量允许我们在一行内创建包含属性的对象,提高了代码的可读性。属性名可以用引号括起来,特别是当属性名是关键字(如”class”)或包含特殊字符时。
值得注意的是,所有JavaScript对象都继承自`Object.prototype`。在下面的例子中,我向`Object.prototype`添加了`foo`属性,然后创建一个字符串,并尝试访问`foo`属性。由于字符串实例没有`foo`属性,所以JavaScript会查找原型链,最终在`Object.prototype`中找到`foo`值。
“`html
Object.prototype.foo = ‘foo’;
var myString = ‘bar’;
// 输出 “foo”,通过原型链在Object.prototype.foo中找到
console.log(myString.foo);
“`
总结:
– 添加到`Object.prototype`的内容会在`for…in`循环和原型链中显示,因此应谨慎操作。
– 避免修改`Object.prototype`,以防止意外的行为。