JS基于面向对象的创建对象,主要有工厂模式、构造函数模式、原型模式三种。本文主要分析了这三种模式的特点、利弊,以及一些细节问题。
参考:js高程 红宝书(第四版)
一、工厂模式
function createPerson(name, age, job) {
let o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function() {
console.log(this.name);
};
return o;
}
let person1 = createPerson("Nicholas", 29, "Software Engineer");
let person2 = createPerson("Greg", 27, "Doctor");
- 优点:创建多个相似对象的问题
- 缺点:没有解决对象识别问题(即新创建的对象是什么类型?)
二、构造函数模式
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
console.log(this.name);
};
}
let person1 = new Person("Nicholas", 29, "Software Engineer");
let person2 = new Person("Greg", 27, "Doctor");
person1.sayName(); // Nicholas
person2.sayName(); // Greg
1. 构造函数模式 与 工厂模式 是比较像的,只是有如下区别:
- 没有显式地创建对象
- 属性和方法直接赋值给了 this
- 没有 return
- 函数名 Person 的首字母是大写
2. 用 new 调用构造函数会执行如下操作:
- 在内存中创建一个新对象。
- 这个新对象内部的 [[Prototype]] 特性被赋值为构造函数的 prototype 属性。
- 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
- 执行构造函数内部的代码(给新对象添加属性)。
- 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
3. 构造函数的问题:
- 其定义的方法在每个实例上都创建一遍,不同实例的方法不是同一个 Function 实例(JS 中函数是对象,因此每次定义函数时,都会初始化一个对象。)
function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = new Function("console.log(this.name)")