对象
创建对象的方式
1. 直接创建
const obj = { name: 'zgh', age: 23 };
创建一个纯对象,不会继承 Object 的属性和方法,如 constructor、valueOf 等
const obj = Object.create(null);
2. new Object()
let obj = new Object();
obj.name = 'zgh';
obj.age = 23;
3. 工厂模式
工厂模式解决了重复实例化多个对象的问题
function createObj(name, age) {
let obj = new Object();
obj.name = name;
obj.age = age;
return obj;
}
let person1 = createObj('zgh', 23);
let person2 = createObj('lrx', 22);
4. 构造函数模式
function createObj(name, age) {
this.name = name;
this.age = age;
}
let person1 = new createObj('zgh', 23);
let person2 = new createObj('lrx', 22);
console.log(person1, person2);
5. 原型模式
function Person() {}
Person.prototype.name = 'zgh';
Person.prototype.age = 23;
console.log(Person.prototype); // {name: "zgh", age: 23, constructor: ƒ}
let person1 = new Person(); // 创建一个实例 person1
console.log(person1.name); // zgh
6. 混合模式(构造函数模式+原型模式)
构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype = {
// 每个函数都有prototype属性,指向该函数原型对象,原型对象都有constructor属性,这是一个指向prototype属性所在函数的指针
constructor: Person,
say: function () {
console.log(this.name);
}
};
let person1 = new Person('zgh', 23);
let person2 = new Person('lrx', 22);
console.log(person1, person2);
可以看出,混合模式共享着对相同方法的引用,又保证了每个实例有自己的私有属性。最大限度的节省了内存
Object.create()
Object.create()
以一个现有对象作为原型,创建一个新对象。参数接收:Object
、null
const user = {
age: 24,
say() {
console.log(`My name is ${this.name}. ${this.age} years old`);
}
};
const me = Object.create(user);
me.name = 'zgh';
me.age = 23;
me.say(); // My name is zgh. 23 years old
创建一个新对象{name: "zgh", age: 23}
,在这个对象的__proto__
上有 user
对象
valueOf
valueOf()
通常由 js 在后台自动调用,不会显式的出现在代码里
const obj = {
i: 1,
valueOf: function () {
if (this.i === 1) {
this.i++;
return 1;
} else {
return 2;
}
}
};
if (obj == 1 && obj == 2) {
console.log(obj);
}
这段代码会执行,此时 obj.i 的值为 2
空对象判断
Object.getOwnPropertyNames()
,返回对象中属性名称组成的数组Object.keys()
,返回对象中属性名称组成的数组- 转为 json 字符串
let obj = {};
Object.getOwnPropertyNames(obj).length === 0; // true
Object.keys(obj).length === 0; // true
JSON.stringify({}) === '{}'; // true
Object.keys()
返回对象中属性名称组成的数组。Object.keys()
只会返回对象自身的可枚举属性名,而不会返回对象从原型链继承的属性名。
const obj = { a: 1, b: 2 };
Object.keys(obj); // ['a', 'b']
Object.values()
返回对象中属性的值组成的数组
const obj = { a: 1, b: 2 };
Object.values(obj); // [1, 2]