基础版:
使用Object构造函数或者使用对象字面量的创建方式。
// 对象字面量用法
const obj = {
name: 'javascript',
};
// 使用new关键字,调用Object构造函数
const obj_ = new Object();
obj_.name = 'java';
console.log(obj); // {name: 'javascript'}
console.log(obj_); // {name: 'java'}
注意:如果在调用Object构造函数的同时,传入了参数,那么会根据传入参数的类型,返回其相应的包装类型。
// 得到一个String对象
const objString = new Object('wind');
console.log(objString instanceof String); // true
// 得到一个Number对象
const objNumber = new Object(20);
console.log(objNumber instanceof Number); // true
// 注意:如果传入的参数是引用类型,那么会返回传入的参数
const arr = [1, 2, 3];
const objArray = new Object(arr);
console.log(objArray); // [1, 2, 3]
console.log(arr === objArray); // true
进阶版:
工厂模式:
不了解设计模式可以看一下:快速记忆23种设计模式 - 知乎
如果你需要创建大量属性相似的对象,那么工厂模式很适合你。它能大大减少代码量。
function createPerson(name, age) {
const person = {};
person.name = name;
person.age = age;
person.getInfo = function () {
return name + '-' + age;
}
return person;
}
const person1 = createPerson('Jack', 18);
const person2 = createPerson('Anna', 18);
console.log(person1.getInfo()); // Jack-18
console.log(person2.getInfo()); // Anna-18
由于createPerson函数返回的是一个Object对象,所以用这种方式创建的对象不存在对象标识问题(即新建的对象是什么类型),它完全取决于你返回的数据的类型。
构造函数模式:
使用构造函数,可以创建特定类型的对象。就比如,可以使用Object构造函数创建Object类型的对象,使用Array构造函数可以创建Array类型的对象。
那么我们也可以写一个构造函数,创建属于特定类型的对象,以上面工厂模式的例子可以这样写:
function Person(name, age) {
this.name = name;
this.age = age;
this.getInfo = function () {
return name + '-' + age;
}
}
const person1 = new Person('Jack', 18);
const person2 = new Person('Tom', 20);
console.log(person1.getInfo()); // Jack-18
console.log(person2.getInfo()); // Tom-20
console.log(person1 instanceof Person); // true
console.log(person2 instanceof Person); // true
之后我会写一篇关于调用 new 、instanceof关键字的工作行为的详解,这里只需要大致了解它们的作用就可以了。
相比于工厂模式,构造函数模式的不同在于:①可以确保实例被标识为特定类型 ;②必须使用 new 关键字调用,否则该构造函数就相当于一个普通函数;
如果构造函数内存在return,那你就要小心了:
情况一:构造函数使用return关键字中断代码执行。这种情况下,构造函数还是能够返回特定类型的对象。
function Person(name, age) {
if (age > 100) {
return;
}
this.name = name;
this.age = age;
this.getInfo = function () {
return name + '-' + age;
}
}
const person1 = new Person('Jack', 18);
const person2 = new Person('Tom', 200);
console.log(person1 instanceof Person); // true
console.log(person2 instanceof Person); // true
情况二:构造函数使用return关键字返回了其他类型的数据。这种情况下,构造函数不再返回特定类型的对象。
function Person(name, age) {
this.name = name;
this.age = age;
this.getInfo = function () {
return name + '-' + age;
}
if (age > 100) {
return {};
}
}
const person1 = new Person('Jack', 18);
const person2 = new Person('Tom', 200);
console.log(person1 instanceof Person); // true
console.log(person2 instanceof Person); // false