JS中创建对象的常用模式浅析

在JavaScript中一切都可以看作为对象,那么了解和创建对象是在学习和工作中必不可少的环节。此文对JavaScript中创建对象的几种模式进行分析。

工厂模式

当我们使用对象字面量或者Object构造函数的方法创造很多类似对象的时候,难以避免的会产生大量重复代码。于是在JS中实现了一种工厂模式解决,用函数封装某种指定类型的接口的创建细节。

function createPerson(name,age,job){
    var o = new Object(); //显示创建对象“o”
    o.name = name;
    o.job = job;
    o.age = age;
    o.sayName = function(){
        alert(this.name);
    };
    return o;
}

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

构造函数模式

工厂模式完美的解决了抽象创建对象的问题,但是我们却无法知道创建的每一个新对象的类型,那么我们看看下面这个模式。

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function(){
        alert(this.name);
    };
}

var p1 = new Person("Nicholas",29,"Software Engineer");
var p2 = new Person("Greg",27,"Doctor");

p1和p2分别保存着Person的不同实例。这俩对象都有一个构造函数指向Person。由于对象的constructor属性的作用就是用来标示对象类型的,所以我们可以通过构造函数创建对象的方式来识别对象类型。

p1.constructor == Person; //true
p2.constructor == Person; //true

我们可以通过instanceof操作符来验证以上结论。p1和p2既是Object(需要了解的事所有对象均继承与Object,本文不予讨论)的实例,亦是Person的实例。

p1 instanceof Person;//true
p1 instanceof Object;//true
p2 instanceof Person;//true
p2 instanceof Object;//true

当然构造函数也是函数,与其他函数的唯一区别只是在于调用它们的方式不同。

new操作符调用:任何函数以此调用方式都可作为构造函数。

不通过new操作符调用:普通函数。

现在来仔细看看构造函数模式来创建对象的方法。发现p1和p2都包含一个sayName()的方法,由于定义一个函数也就等于实例化一个对象,于是我们可以这么写:

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = new Function("alert(this.name)");
}

这么一来,很明显,p1和p2这两个不同实例上出现了不相等的同名函数。但是,两个一摸一样的函数完成同样的功能是完全没有必要的。

p1.sayName == p2.sayName; //false

所以我们最终需要使用原型模式。

原型模式

我们先看看原型模式的示例代码。

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

var p1 = new Person();
p1.sayName(); // "Nicholas"

var p2 = new Person();
p2.sayName(); // "Nicholas"

原型模式中出现了一个关键词prototype,我们暂且将这个属性理解为一个指针,指向一个对象。优点是可以让所有对象的实例共享它所包含的属性和方法。

意思就是。

p1.sayName == p2.sayName; // true

当然,要了解原型模式的工作原理还需要深入了解JS中的原型对象的性质。以上就是三种常用构建对象的方法,优缺点如上文已分析,如有不足请留言讨论。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值