ECMAScript 中的对象其实就是一组数据和功能的集合。对象通过new 操作符后跟对象类型的名称来创建。开发者可以通过Object类型的实例来创建自己的对象,然后再给对象添加属性和方法。
let o = new Object();
Object 的实例本身并不是很有用,但理解和他相关的概念非常重要。类似Java中的java.lang.Object,ECMAScript 中的Object也是派生其他对象的基类。Object 类型的所有属性和方法在对象上同样存在。
每个Object 实例都有如下属性和方法。
- constructor:用于创建当前对象的函数。在前面的例子中,这个属性就是Object()函数。
- hasOwnProperty(propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性。要检查的属性名必须是字符串(如o.hasOwnProperty('name'))或符号。
- isPrototypeOf(object):用于判断当前对象是否为另一对象的原型。
- propertyIsEnumerable(propertyName):用于判断给定的属性是否可以使用for-in语句枚举。与hasOwnProperty一样,属性名必须是字符串。
- toLocaleString():返回对象的字符串表示,该字符串反应对象所在的本地化执行环境。
- toString():返回对象的字符串表示。
- valueOf():返回对象对应的字符串,数值或布尔值表示。通常与toString()的返回值相同。
因为在ECMAScript 中Object 是所有对象的基类,所以任何对象都有这些属性和方法。
严格来讲,ECMA-262中对象的行为不一定适合JavaScript中的其他对象。比如浏览器环境中的BOM和DOM对象,都是由宿主环境定义和提供的宿主对象。而宿主对象不受ECMA-262约束,所以它们可能会也可能不会继承Object。
创建Object 类型的两种方式
第一种:通过new 操作符和Object 的构造函数创建
let person = new Object();
person.name = "Nicholas";
person.age = 29;
第二种 对象字面量表示法
对象字面量是对象定义的简单形式,目的是为了简化包含大量属性的对象的创建。
let person = {
name: "Nicholas",
age: 29
};
在这个例子中,左大括号({)表示对象字面的开,因为他出现在一个表达式上下文中。在ECMAScript 中,表达式上下文指的是期待返回值的上下文。赋值操作符表示后面要等待一个值,因此左大括号表示一个表达式的开始。同样是左大括号,如果出现在语句上下文中,比如if 语句的条件后面,则表示一个语句块的开始。
创建对象的注意点:在使用对象字面量表示法定义对象时,并不会实际调用Object 构造函数。
创建对象的最佳实践
虽然使用哪种方式创建Object 实力都可以,但实际上开发者更倾向于使用对象字面量表示法。这是因为对象字面量代码更少,看起来也更有封装所有相关数据的感觉。事实上,对象字面量已经成为给函数传递大量可选参数的主要形式。
function displayInfo(args){
let output = "";
if(typeof arges.name == "string"){
output += "Name: " + args.name + "\n";
}
if(typeof args.age == "number"){
output += "Age: " + args.age + "\n";
}
alert(output);
}
displayInfo({
name: "Nicholes",
age: 29
});
displayInfo({
name "Greg"
});
这种模式非常适合函数有大量可选参数的情况。一般来说,命名参数更直观,但在可选参数过的时候就显的笨拙了。最好的方式是对必选参数使用命名参数,在通过一个对象字面量来封装多个可选参数。
对象属性的两种存取方法:
第一种方式:通过点语法存取对象属性。
let params = {
name: "Nicholes",
age: 29
};
params.name = "wang";
console.log(params.name);
第二种方式,通过中括号来存取属性。
let params = {
name: "Nicholes",
age: 29,
};
params["name"] = "wang";
console.log(params["name"]);
从功能上讲,这两种存取属性的方式没有区别。使用中括号的主要优势是 可以通过变量访问属性。
let propertyName = "name";
console.log(params[propertyName]);// wang
另外,如果属性名中包含可能回导致语法错误的字符串,或者包含关键字/保留字时,也可以使用中括号语法。
person["first name"] = wang;
通常,点语法时首选的属性存取方式,除非访问属性时必须使用变量。