JS 创建对象的7种方法(三)

4. 组合使用构造函数模式和原型模式(Hybrid)

构造函数模式用于定义实例属性

原型模式用于定义方法和共享的属性。

function People(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Court", "Ann"];
}

People.prototype = {
    constructor: People,
    sayName: function(){
        alert(this.name);
    },
    sayFriends: function(){
        alert(this.friends);
    }
};

var people1 = new People("Bob", 19, "Tester");
var people2 = new People("Baby", 22, "Developer");
people1.friends.push("Alice");

people1.sayFriends();    //Court,Ann,Alice
people2.sayFriends();    //Court,Ann

5.动态原型模式(Dynamic)

通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。

function People(name, age, title){
    this.name = name;
    this.age = age;
    this.title = title;
    
    if(typeof sayName != "function"){
        People.prototype.sayName = function(){
            alert(this.name);
        }
    }
}

var people = new People("Bob", 22, "Developer");
people.sayName();    //Bob

6.寄生构造函数(Parasitic)

这种模式的基本思想是创建一个函数,该函数的作用是封装创建对象的代码,然后再返回新创建的对象。

function People(name, age, title){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.title = title;
    o.sayName = function(){
        alert(this.name);
    }
    return o;
}

var people = new People("Bob", 41, "Doctor");

除了使用new操作符来创建新实例,这个模式和工厂模式是一样的。

这种模式可以在特殊情况下用来为对象创建构造函数。假设我们想创建一个具有额外方法的特殊数组,由于不能直接修改Array构造函数,因此可以使用这个模式。

function SpecialArray(){
    var value = new Array();
    
    value.push.apply(value, arguments);
    value.toPipledString = function(){
        return this.join("| ");
    }
    
    return value;
}

var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipledString());    //red| blue| green

使用这种模式创建的对象 不能依赖instanceof操作符来确定其类型。

7.稳妥构造函数模式(Durable)

稳妥构造函数遵循与寄生构造函数类似的模式,有两点不同:

  1. 新创建对象的实例方法不引用this
  2. 不使用new操作符调用构造函数
function Person(name, age, title){
    var o = new Object();
    
    o.sayName = function(){
        alert(name);
    }
    return o;
}

var person = Person("Bob", 30, "Software Engineer");
person .sayName();    //Bob

使用这种模式创建的对象 不能依赖instanceof操作符来确定其类型。

原文地址:https://www.cnblogs.com/PrajnaParamita/p/5753222.html