首页 > JavaScript > JavaScript Creating Objects — The Factory Pattern
2010四月8

JavaScript Creating Objects — The Factory Pattern

本文,参考自NC的《JavaScript 高级程序设计 第二版》。

在JavaScript中,创建对象的最简单方法就是去 new 一个 Object 对象的实例,并给它添加属性和方法。早期的JavaScript工程师,经常使用这种方式创建JavaScript对象。例如:

var person = new Object();
person.name = “Nicholas”;
person.age = 29;
person.job = “Software Engineer”;
                   
person.sayName = function(){
    alert(this.name);
};

看看人家,NC写这本书的时候才29岁,真牛。

当创建多个具有相同接口的对象时,就要写好多重复的代码。为了解决这个问题,开发者开始使用一种“工厂模式”的变种。

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");

我们把一切参数都扔给了这个工厂,让工厂来生产一个模子刻出来的产品。看起来很完美,解决了创建对象类的问题。但是,这种方法创建类有两大弊端:

  1. the factory pattern didn ’ t address the issue of object identification,即使用instanceof 运算符检验,其并不属于createPerson类
  2. 其为每个对象都创建了相同的函数属性,占用了过多的空间

同时,使用工厂模式创建的JavaScript对象类,总是感觉在语义上有些不爽,不像那些使用构造函数方式,用new运算符创建对象那样正规,有点不走寻常路的感觉。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Js Factory Pattern</title>
    </head>
    <body>
        <script type="text/javascript">
            function createPerson(name,age,job){
                var oPerson = new Object;
                oPerson.name = name;
                oPerson.age  = age;
                oPerson.job  = job;
               
                oPerson.sayName = function(){
                    alert(this.name);
                }
                return oPerson;
            }
           
            var person1 = createPerson('simaopig','25','phper');
           
            var person2 = createPerson('虫zi','25','jser');
           
            person1.sayName();
           
            person2.sayName();
        </script>
    </body>
</html>

让我们验证一下其占用过多内存的问题吧:

js factory pattern

js factory pattern


js factory pattern debug

js factory pattern debug

图中我们可以看到,每个createPerson对象的实例,都拥有各自的sayName()副本。上面的图有点不恰当,因为Prototype的函数,在该图看起来也是两个属性。虽然使用prototype其函数指向的是同一个地址。

如何解决这个问题呢?同学们,期待我后面的日志吧(卖个关子,嘿嘿)。。

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/04/08/1741/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

19 Responses to “JavaScript Creating Objects — The Factory Pattern”

  1. #1 simaopig 回复 | 引用 Post:2010-04-08 16:52

    写完代码才想起来,其实我26了。。骗人了。 :sad:

    [回复]

  2. #2 卢松松 回复 | 引用 Post:2010-04-08 22:12

    26没考虑转行吗?

    [回复]

  3. #3 simaopig 回复 | 引用 Post:2010-04-09 09:20

    @卢松松
    能转啥呢?呵呵。这行挺喜欢的啊。先干着吧。

    [回复]

  4. #4 减肥食谱 回复 | 引用 Post:2010-04-09 18:43

    国外的代码控就是厉害,牛人一堆堆的,29岁出书 :arrow: :arrow:

    [回复]

  5. #5 JS领事 回复 | 引用 Post:2010-04-09 20:54

    这是什么调试工具呢?

    [回复]

  6. #6 Four eyes 回复 | 引用 Post:2010-04-09 21:09

    跟我的域名 太想了

    :roll:

    [回复]

  7. #7 simaopig 回复 | 引用 Post:2010-04-10 17:34

    @JS领事
    IE7、IE8自带的 IEDEVELOPER

    [回复]

  8. #8 simaopig 回复 | 引用 Post:2010-04-10 17:35

    @Four eyes
    哈哈,猿粪啊。猿粪。。。

    [回复]

  9. #9 Brhum 回复 | 引用 Post:2010-04-10 21:17

    使用的调试软件是什么?

    [回复]

  10. #10 陶陶 回复 | 引用 Post:2010-04-10 22:40

    抽空更新下我博客链接吧。。。

    [回复]

  11. #11 simaopig 回复 | 引用 Post:2010-04-11 11:03

    @陶陶
    已经更新完了。呵呵。

    [回复]

  12. #12 simaopig 回复 | 引用 Post:2010-04-11 11:04

    @Brhum
    看我给楼上的回复。呵。

    [回复]

  13. #13 simaopig 回复 | 引用 Post:2010-04-11 11:04

    @减肥食谱
    嗯。29岁,而且出的是第二版。。第一版也是人家的。牛呗。

    [回复]

  14. #14 回复 | 引用 Post:2010-04-11 18:06

    是啊现在 写js 也喜欢 直接封装好 ! 然后 调用即可 :mrgreen:

    [回复]

  15. #15 二维码 回复 | 引用 Post:2010-04-12 10:13

    来过了,支持一下。

    [回复]

  16. #16 网站素材 回复 | 引用 Post:2010-04-12 16:11

    支持一下啊

    [回复]

  17. #17 十年灯 回复 | 引用 Post:2010-04-12 17:46

    :x 你还卖关子,太过份了…

    [回复]

  18. #18 simaopig 回复 | 引用 Post:2010-04-12 17:48

    @十年灯
    哈哈。话说你的域名咋又变回jo2了呢?脚儿网。呵呵。我还是很怀念你这个域名的。 :smile:

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)