注:本文中部分描述都是操作我的书《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();