创建对象模式
工厂模式解决了什么, 又缺什么?
- 做法: 在函数内部创建对象、添加属性并返回;
- 优点: 复用创建逻辑, 不暴露细节;
- 缺点: 无法判断对象的具体类型, 所有实例都是
Object;
function createPerson(name, age) {
const o = new Object();
o.name = name;
o.age = age;
o.sayName = function () {
console.log(this.name);
};
return o;
}
构造函数模式如何 work?
- 定义: 用普通函数形式定义, 约定首字母大写;
new的步骤:- 创建新对象;
- 把新对象的
[[Prototype]]设为构造函数的prototype; - 把构造函数内的
this指向新对象; - 执行构造函数体;
- 返回新对象 (除非构造函数显式返回对象);
- 类型识别: 实例的
constructor指向构造函数,instanceof为真;
function Person(name) {
this.name = name;
}
const person1 = new Person("Nicholas");
person1.constructor === Person; // true
person1 instanceof Person; // true
构造函数不加 new 调用会发生什么?
- 结果: 退化为普通函数,
this不再指向新对象, 非严格模式下指向全局对象, 属性被写到全局;
Person("Greg"); // this 指向 window
window.name; // "Greg"
- 规避: 在严格模式下编写, 未绑定调用会直接报错, 见 严格模式;
构造函数模式有什么缺点?
- 方法重复: 在构造函数内定义的方法, 每个实例各持一份, 浪费内存;
- 改进: 把方法放到
prototype上共享, 原型机制的细节见 原型与原型链;