跳到主要内容

创建对象模式

工厂模式解决了什么, 又缺什么?​

  • 做法: 在函数内部创建对象、添加属性并返回;
  • 优点: 复用创建逻辑, 不暴露细节;
  • 缺点: 无法判断对象的具体类型, 所有实例都是 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 的步骤:
    1. 创建新对象;
    2. 把新对象的 [[Prototype]] 设为构造函数的 prototype;
    3. 把构造函数内的 this 指向新对象;
    4. 执行构造函数体;
    5. 返回新对象 (除非构造函数显式返回对象);
  • 类型识别: 实例的 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 上共享, 原型机制的细节见 原型与原型链;