JavaScript的基本数据类型,一种复合值,可看做是属性的无序集合。
每个属性都是一个名/值对。
属性名是字符串,因此可以把对象看成是从字符串到值得映射
对象是动态的,可以增加或删除属性。
除了字符串、数值、true、false、null和undefined,其他值都是对象。
通过new调用构造函数(constructor)来创建并初始化一个新对象。
JavaScript语言核心中的原始类型都包含内置构造函数,如Object()、Array()、Date()等。
原型
所有内置构造函数都具有一个继承自Object.prototype的原型。
如:Array.prototype的属性继承自Object.prototype。
通过层级的原型继承形成的链接,称为“原型链”(prototype chain)。
示例
let obj = { value: 100 };
Object.prototype.flag = "head";
console.log(obj.flag);
let arr = [1, 2, 3, 4];
console.log(arr.flag);
Object.create( )
示例
// obj1继承了属性x和y。
let obj1 = Object.create({ x: 1, y: 2 });
//obj2不继承任何属性和方法。
let obj2 = Object.create(null);
//obj3是一个普通的空对象。
let obj3 = Object.create(Object.prototype);
作为关联数组的对象
let result = {
data1: {
name: "Language",
value: "Chinese",
},
data2: {
name: "Country",
value: "China",
},
data3: {
name: "Gender",
value: "Male",
},
};
for (let i = 1; i < 4; i++) {
let data = result["data" + i];
console.log(`${data.name}-->${data.value}`);
}
继承
理解原型继承链
let a = {};
a.x = 1;
let b = inherit(a);
b.y = 2;
let c = inherit(b);
c.z = 3;
console.log(c.toString());
console.log(c.x + c.y + c.z);
删除属性
delete运算符可以删除对象的属性。
let auth = book.author;
delete book.author;
console.log(book, auth);
枚举属性
for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承的属性),把属性名称赋值给循环变量。
let o =Object.create({m:10,n:20});
o.x=1; o.y=2; o.z=3;
for (let p in o) {
console.log(p, o[p]);
}