西红柿爱番茄

Feed Rss

元编程的思想

03.14.2010, Javascript, by .

2010年3月13日的那个中午,踏上火车,回到学校,回到图书馆了,离别了有段日子了,也甚是思念在图书馆的点点滴滴。

“在图书馆翻书看的时候无意中看到一个比较有意思的名词:元编程。自由百科全书的定义如下:编写一些程序来提前生成一些数据或代码供运行时使用,用来生成这些数据信息或者代码的程序称为元程序,编写这种程序就称为元编程。”

“接着它又说啦:在Javascript中实践元编程,其中所谓的元程序就是function,而供运行时使用的数据或代码就是Function或function引出的一系列扩展。因为作为一个function,既可以直接执行,有可以充分利用function代码体的上下文,如享受apply或call等方法带来的便利,而作为一个构造方法使用,则受到比较大的限制,缺少了function的灵活性。”

暂且不说它是否说的对与不对,先看它举例的代码再说:
[javascript]
//createConstructor
function createConstructor(fn){
var p=fn.prototype;
function func(){}
func.prototype=p;
func.prototype.constructor=p.constructor;
//定义新对象的构造
func.prototype.a="a";
func.prototype.show=function(){alert(this.a);}
}

//createFunction
var createFunction=function(fn){
var f = fn;
var func=function(){
return f.apply(this,arguments);
}
func.prototype=fn.prototype;
return func;
[/javascript]
上面既是原书中举的两个例子,初看起来,还比较新颖,可是测试一下发现了一个不足之处,就是创建出来的function或者构造函数,它一变,原始的function或者构造函数也都变了,这个实用性不大。我将它修改一下,就可以实现类似于C++中的基类、子类之间的继承关系了:
[javascript]
function createFunc(fn){
var f = fn;
var func = function(){
return f.apply(this, arguments);
}
for (var key in f.prototpe) { //复制
func.prototype[key] = f.prototype[key];
}
return func;
}
[/javascript]
上面修改过后的是对“基类”的复制,“子类”的修改,不会影响到“基类”。

元编程的思想 有1条回应

  1. 引用: Javascript's kiss » Blog Archive » new该弃用了吗?

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>