JavaScript中的动态扩展模式

阅读更多

注:本文中部分描述都是操作我的书《JavaScript高级应用与实践》而言,还请朋友们多多支持我的书,详情请见:

博主网站地址:

http://m9m.3322.org/doc/js/md00.jsp

“北京电子工业出版社”地址

http://www.phei.com.cn/bookshop/bookinfo.asp?bookcode=TP061230%20&booktype=main

所谓的“动态扩展模式”是指JavaScript中当一个对象已经实例化后,我们对对象的原型(prototype)上扩展相应的属性(方法也是一种属性,只是类型为function罢了),能够在这个已经实例化的对象上体现(正确访问)的特性叫做“动态扩展模式”。这是许多编程语言所无法比拟的特性——对已经实例的对象原型上扩展方法。

示例如下:

“函数扩展方式”是指通过在Function的原型上定义方法method为将来定义的类的原型上扩展属性的方式。
// 定义为对象原型上扩展属性的方法,这样设计的好处是简化原型扩展的累赘代码
// name :扩展的属性名称(函数也是一种属性),
// funcOrProp :扩展的属性值(可以是函数对象)
Function.prototype.method = function(name, funcOrProp)
{
this.prototype[name] = funcOrProp;
}
var myClass = function(){}; // 或者 function myClass(){}
// 显示姓名
myClass.method("displayName", function()
{
alert(this.name);
});
// 显示性别
myClass.method("displaySex", function()
{
alert(this.sex);
});
// 姓名、性别
myClass.method("name", "xiatian");
myClass.method("sex", "male");
// 使用:
var oMy = new myClass();
oMy.displayName();
oMy.displaySex();
// 对象实例化后,给他的原型上扩展方法,
// 依然能在已经实例化对象上正确访问,这就是“动态模式
// 但是注意,你不能改变已经实例化的对象的原型,
// 例如: oMy.prototype.name = "summer";
// 因为 prototype 只有在类、对象定义时能够使用,
// 实例化对象的 prototype 是无效的对象,
// 而实例化对象的 constructor 是可以被重新定义的
// oMy.constructor = function(){alert(99)} 】,
// 但是已经没有多大的实际意义了
// 当然,这里通过在 myClass.prototype. dspAll=function(){…}; 进行扩展效果也是一样的
myClass.method("dspAll", function()
{
alert([this.name, this.sex].join(","));
});
// 下面能正确访问,这也是本节描述的“动态扩展原型模式
oMy.dspAll();

你可能感兴趣的:(JavaScript,设计模式,prototype,出版,编程)