工厂模式:

    1. function createPerson(name, age, job) {
    2. let o = new Object();
    3. o.name = name;
    4. o.age = age;
    5. o.job = job;
    6. o.sayName = function() {
    7. console.log(this.name);
    8. };
    9. return o;
    10. }
    11. let person1 = createPerson("Nicholas", 29, "Software Engineer");
    12. let person2 = createPerson("Greg", 27, "Doctor");

    特点:这种工厂模式虽然可以解决创建多个类似对象的问题,但没有解决对象标识问题(即新创建的对象是什么类型)。

    构造器模式:

    1. function Person(name, age, job){
    2. this.name = name;
    3. this.age = age;
    4. this.job = job;
    5. this.sayName = function() {
    6. console.log(this.name);
    7. };
    8. }
    9. let person1 = new Person("Nicholas", 29, "Software Engineer");
    10. let person2 = new Person("Greg", 27, "Doctor");
    11. person1.sayName(); // Nicholas
    12. person2.sayName(); // Greg

    要创建Person 的实例,应使用new 操作符。以这种方式调用构造函数会执行如下操作。
    (1) 在内存中创建一个新对象。
    (2) 这个新对象内部的[[Prototype]]特性被赋值为构造函数的prototype 属性。
    (3) 构造函数内部的this 被赋值为这个新对象(即this 指向新对象)。
    (4) 执行构造函数内部的代码(给新对象添加属性)。
    (5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

    原型模式:

    1. function Person() {}
    2. Person.prototype.name = "Nicholas";
    3. Person.prototype.age = 29;
    4. Person.prototype.job = "Software Engineer";
    5. Person.prototype.sayName = function() {
    6. console.log(this.name);
    7. };
    8. let person1 = new Person();
    9. person1.sayName(); // "Nicholas"
    10. let person2 = new Person();
    11. person2.sayName(); // "Nicholas"
    12. console.log(person1.sayName == person2.sayName); // true