JavaScript Creating Objects Other Pattern
前面的日志中,抄了好多创建JavaScript对象的方法,包括工厂模式、原型模式、构造函数模式、混合模式、动态原型模式等。好了,大家快看烦了,日志也快结束了。
书中还为我们介绍了另外两种创建JavaScript对象的方法:寄生构造器模式和持久构造器模式。大家再忍耐一下,让我抄完~~
Parasitic Constructor Pattern
当其他创建对象的方法都不适合于你时,寄生构造器模式通常能满足你。该模式的主要意图是通过创建一个构造函数,在构造函数内部创建另一个对象并为其赋予方法,在最后将这个对象返回。
没错,就是用构造函数的模式来写工厂方法,你真聪明。让我们来看一个小例子:
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运算符来确定对象类型。而且其同工厂模式一样,对函数存在重复申明的问题,大大滴浪费了我们的内存空间。
一般这种模式应用并不是很广泛,至少我很少看见这种创建对象的方式,不过并不代表其一无是处。
书中给了一个例子,当你不想破坏数组的原型对象时,却想让其有一个适应你当前程序的通用方法(即,所有数组都可以拥有的方法),一般可以这样做
//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运算符而已。先让我们看一下重写后的例子吧
//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
该系列日志告一段落,抄的我手好累,呵呵。
该系统日志参考文件如下:
- 《Professional.JavaScript.for.Web.Developers.2nd.Edition》
- 《面向对象的 Javascript (声明篇)》http://www.gracecode.com/archives/934/
- 《小议JavaScript之对象构造》http://www.ichenkun.org/post/javascript-object-create/
文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2010/04/26/1754/
版权所有 © 转载时必须以链接形式注明作者和原始出处!
:smile: :smile: :smile: :smile: :smile:
很不错的文章,JavaScript 高级程序设计 第二版里面确实写了很多好文章,相对第一版来说更加深入了一点.
[回复]
交换个链接吧.哥们?
[回复]
@可乐加糖
嗯。对照第二版英文的,和我的第一版比,新增加了好多让我激动的东东。呵呵。
PS:链接已经加上,^_^
[回复]
如果有人看代码都津津有味,不得不说,他一定很幸福。 :grin:
[回复]
@虾
呵呵,生活所迫,形势所逼。 :razz:
[回复]
学习了。
[回复]
:sad: 好复杂….绕晕了
[回复]