书格前端

JavaScript中对象的几种创建方式


JavaScript中对象的几种创建方式

记录JavaScript中创建对象的几种方法。

工厂模式

工厂模式是一种设计模式,抽象创建具体对象的过程,用函数来封装特定接口并创建对象的细节。

实例:

/* 工厂模式 */
function createPerson(name, age, job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        alert(this.name);
    };
    return o;
}

var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

console.log(person1);
console.log(person2);

优点: 解决创建多个相似对象。

缺点: 没有解决对象识别的问题。

构造函数模式

构造函数模式,通过创建自定义的构造函数,定义自定义对象类型的属性和方法。

构造函数,函数名开头使用大写字母。0

实例:

// 构造函数
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    };
}

var person1 = new Person("Perry", 27, "FE");
var person2 = new Person("Kobe", 33, "Player");

console.log(person1);
console.log(person2);

优点: 1、不需要显示的创建对象。 2、它的实例可以标识为一种特定的类型。

缺点: 1、每个方法要在每个实例上重新创建一遍。

原型模式

通过函数的prototype属性进行所有实例共享来添加属性和方法。

实例:

// 原型模式
function Person() {

}

Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function() {
    alert(this.name);
}

var person1 = new Person();
person1.sayName();

var person2 = new Person();
person2.sayName();

console.log(person1.sayName == person2.sayName);

优点: 各实例之间可共享属性和方法。

缺点: 引用类型的属性,实例无法拥有自己的数据。

组合使用构造函数模式和原型模式

组合使用,构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性。

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

Person.prototype = {
    constructor: Person,
    sayName: function() {
        console.log(this.name);
    }
};

优点: 方法可由所有实例共享,引用类型数据可保持独立。 使用广泛。

缺点: 无

动态原型模式

所有的信息都封装在构造函数中。

实例:

// 动态原型模式
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;

    if (typeof this.sayName != "function") {
        Person.prototype.sayName = function() {
            console.log(this.name);
        }
    }
}

var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();

优点: 封装性好。

缺点: 不能使用对象字面量重新原型。

寄生构造函数模式

通过函数封装创建对象的代码,并返回新创建的对象。

实例:

// 寄生构造函数模式
function SpecialArray() {
    var values = new Array();

    values.push.apply(values, arguments);

    values.toPipedString = function() {
        return this.join("|");
    }

    return values;
}

var colors = new SpecialArray("red", "blue", "green");
console.log(colors.toPipedString());

优点: 其他模式不适用的情况下使用。

缺点: 无法使用instanceof来确定对象的类型。 尽量不使用此模式。

稳妥构造函数模式

新创建对象的实例方法不引用this;不使用new操作符调用构造函数。

实例:

// 稳妥构造函数模式
function Person(name, age, job) {
    var o = new Object();

    o.sayName = function() {
        console.log(name);
    }

    return o;
}

var friend = Person("Nicholas", 29, "Software Engineer");
friend.sayName();

优点: 提供安全性,只用通过调用方法访问数据成员。

缺点: 无法确定对象类型。