首页 > 编程语言 > 详细

浅谈JavaScript原型对象与相关设计模式

时间:2015-10-27 19:31:00      阅读:304      评论:0      收藏:0      [点我收藏+]

引言

  本文先从介绍JavaScript中基本的几种设计模式开始,最后引出原型对象,然后对原型对象有一个较全面的介绍。

1、创建对象的几种设计模式

  A、工厂模式

  我们知道在JavaScript中创建对象可以使用Object构造函数或者对象字面量的方式。但是使用这些方式有一个问题,就是调用同一个接口创建对象时会出现大量重复的代码。开发人员通过将创建对象的过程细节封装为一个接口。这样可以解决创建多个相似对象的问题。例子如下:

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

    var person1 = createPerson("张三", 29, "工程师");
    var person2 = createPerson("李四", 33, "销售");

  如以上代码所示:我们在创建相同或相似对象的时候不需要每次都调用Object的构造函数,只需要简单的调用工厂方式来创建对象即可。但是工厂模式没有解决对象识别问题(怎么知道一个对象时什么类型)。因为通过工厂模式创建的对象都是Object类型的,而没法判断是Person类型。后来JavaScript中又引入了构造函数模式。  

  B、构造函数模式

  在JavaScript中通过构造函数可以来创建特定类型的对象,例如:Object、Array等。我们通过构造函数模式来解决对象识别问题。例子如下:

 1 /**
 2      * 构造函数模式
 3      **/
 4     function Person(name, age, job) {
 5         this.name = name;
 6         this.age = age;
 7         this.job = job;
 8         this.sayName = function () {
 9             alert(this.name);
10         }
11     }
12 
13     person1 = new Person("张三", 29, "工程师");
14     person2 = new Person("李四", 33, "销售");

  在构造函数模式中,当代码以13,14行的方式进行调用时会发生以下几个步骤。(1)、创建一个新对象。(2)、将构造函数的作用域赋给新对象(因此this就指向这个新对象)。(3)、执行构造函数中的代码(为新对象添加属性)。4、返回这个新对象。这样person1和person2都有一个constructor(构造函数)属性,该属性指向Person。

  对象的constructor属性最初是用来判断对象类型的,但是判断引用类型的类型还是使用instanceof更加可靠一些。通过构造函数模式我们就可以辨别出对象的类型了,这事构造函数模式胜过工厂模式的地方。当然person1和person2还是Object类型的对象,因为所有对象均继承自Object类型。

  但是构造函数模式也有缺点。通过构造函数模式创建的对象都有一个相同的方法。即每一个方法都需要在每一个对象上重新创建一遍。如上面的例子所示,sayName方法作为一个对象,在每一个对象上面都会创建一个新的函数对象,这无疑是对内存的消耗。其实所有对象只需共用一个sayName函数即可。有人认为只需把sayName方法放到构造函数外面,这个方法在函数数量较少的时候还可以,但是数量一多,会给维护造成一定的困难。这时我们可以引入原型模式来改进这个问题。

  C、原型模式

  我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,这个对象包含可以由特定类型的所有实例共享的属性和方法。这个类似于C#,Java中的static定义的属性(字段)和方法。所有实例共享这些属性和方法。例子如下:

 1 /**
 2      * 原型模式
 3      **/
 4     function Person() { }
 5     Person.prototype.name = "张三";
 6     Person.prototype.age = 29;
 7     Person.prototype.job = "工程师";
 8     Person.prototype.sayName = function () {
 9         alert(this.name);
10     }
11     person1 = new Person();
12     person2 = new Person();

  理解prototype(原型)对象

  创建新函数时,就会根据一组特定的规则为该函数创建prototype属性。这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向包含prototype属性所在的函数的指针。看下图解释:

技术分享

浅谈JavaScript原型对象与相关设计模式

原文:http://www.cnblogs.com/dreamGong/p/4914847.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!