首页 > JavaScript > JavaScript Creating Objects Other Pattern
2010四月26

JavaScript Creating Objects Other Pattern

前面的日志中,抄了好多创建JavaScript对象的方法,包括工厂模式、原型模式、构造函数模式、混合模式、动态原型模式等。好了,大家快看烦了,日志也快结束了。

书中还为我们介绍了另外两种创建JavaScript对象的方法:寄生构造器模式和持久构造器模式。大家再忍耐一下,让我抄完~~

Parasitic Constructor Pattern

当其他创建对象的方法都不适合于你时,寄生构造器模式通常能满足你。该模式的主要意图是通过创建一个构造函数,在构造函数内部创建另一个对象并为其赋予方法,在最后将这个对象返回。

没错,就是用构造函数的模式来写工厂方法,你真聪明。让我们来看一个小例子:

function Person(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 person = new Person("Nicholas", 29, "Software Engineer");
person.sayName();  //"Nicholas"

在构造函数内部,我们声明一个新的对象,并为其赋予方法然后将之返回。除了使用new运算符让我们知道这是一个构造函数模式,否则一切看起来都是一个工厂,不是吗?

When a constructor doesn’t return a value, it returns the
new object instance by default. Adding a return statement at the end of a constructor allows you to
override the value that is returned when the constructor is called.

在返回的新对象和构造函数之间没有任何关系,这也就意味着你不能通过instanceof运算符来确定对象类型。而且其同工厂模式一样,对函数存在重复申明的问题,大大滴浪费了我们的内存空间。

一般这种模式应用并不是很广泛,至少我很少看见这种创建对象的方式,不过并不代表其一无是处。

书中给了一个例子,当你不想破坏数组的原型对象时,却想让其有一个适应你当前程序的通用方法(即,所有数组都可以拥有的方法),一般可以这样做

function SpecialArray(){      
                   
    //create the array
    var values = new Array();
   
    //add the values
    values.push.apply(values, arguments);
   
    //assign the method
    values.toPipedString = function(){
        return this.join("|");
    };
   
    //return it
    return values;        
}
                   
var colors = new SpecialArray("red", "blue", "green");
alert(colors.toPipedString()); //"red|blue|green"

此段代码不多解释。

Durable Constructor Pattern

持久构造器模式和刚才介绍的寄生构造器模式看起来很像。只是在内部对象的方法里不使用this关键字,创建对象的实例时也不使用new运算符而已。先让我们看一下重写后的例子吧

function Person(name, age, job){
                   
    //create the object to return
    var o = new Object();
                   
    //optional: define private variables/functions here
                   
    //attach methods
    o.sayName = function(){
        alert(name);
    };    
                   
    //return the object
    return o;
}
var person = Person("Nicholas", 29, "Software Engineer");
person.sayName();  //"Nicholas"

该种创建对象的方法适用于对数据安全要求很高的情况下,除了公有方法,没有任何途径可以获取内部数据,通过闭包严格的保证了数据的安全性。缺点嘛同上一模式。呵呵。

Summary

该系列日志告一段落,抄的我手好累,呵呵。

该系统日志参考文件如下:

  1. 《Professional.JavaScript.for.Web.Developers.2nd.Edition》
  2. 《面向对象的 Javascript (声明篇)》http://www.gracecode.com/archives/934/
  3. 《小议JavaScript之对象构造》http://www.ichenkun.org/post/javascript-object-create/

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

7 Responses to “JavaScript Creating Objects Other Pattern”

  1. #1 可乐加糖 回复 | 引用 Post:2010-04-28 19:04

    :smile: :smile: :smile: :smile: :smile:

    很不错的文章,JavaScript 高级程序设计 第二版里面确实写了很多好文章,相对第一版来说更加深入了一点.

    [回复]

  2. #2 可乐加糖 回复 | 引用 Post:2010-04-28 20:44

    交换个链接吧.哥们?

    [回复]

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

    @可乐加糖
    嗯。对照第二版英文的,和我的第一版比,新增加了好多让我激动的东东。呵呵。

    PS:链接已经加上,^_^

    [回复]

  4. #4 回复 | 引用 Post:2010-04-29 09:57

    如果有人看代码都津津有味,不得不说,他一定很幸福。 :grin:

    [回复]

  5. #5 simaopig 回复 | 引用 Post:2010-04-29 09:58

    @虾
    呵呵,生活所迫,形势所逼。 :razz:

    [回复]

  6. #6 163导航网博客 回复 | 引用 Post:2010-04-29 13:31

    学习了。

    [回复]

  7. #7 十年灯 回复 | 引用 Post:2010-05-13 11:45

    :sad: 好复杂….绕晕了

    [回复]

发表评论

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