js-overload

Javascript 的重载

Overview

我们知道在其他面向对象的语言比如JAVA还有Python等,他们都有重载这一概念。但是在Javascript中并没有这个面向对象的特性,其实javascript确实被定义为一门面向对象语言,但是面向对象的很多特性javascript都没有实现。但是javascript提供了灵活性很高的接口——prototype。很多特性我们可以另外实现在通过prototype添加,这样我们便可以使用这些特性。但是这里要说明一点的:有人说既然这门语言没有实现它们为什么还要多此一举的去实现它们呢?很好的问题,但是我想说自己加这些“轮子”只是为了让自己的程序更加的精简和高可用 一切都是为了Write Less Do More!
Ok 说了这么多,今天我想分享的是面向对象中重载(overload)在javascript中的应用和实现。Let’s do it!

Javascript重载的实现

需要实现重载我们需要了解闭包(closure),还有我们会用到Function的length熟悉和arguments,this。当然我们还用到了每个Function都实现的apply方法。有了这些知识之后我们便可以来实现重载了。下面就是javascript重载的实现:


function overLoad(obj,funcName,fn){
//这里我们用一个变量来保存之前定义的函数
var old = obj[funcName];
//程序的核心实现
obj[funcName] = function(){
//这里去判断fn函数定义的形参的个数是不是等于传入这个函数的实参的个数
if(fn.length == arguments.length){
//如果是话那么我们直接去调用fn
return fn.apply(this,arguments);
}else{
//否则我们检查如果old是一个函数的话
if(typeof old == ‘function’){
//是的话直接调用
return old.apply(this,arguments);
}else{
//抛出一个错误
thorw ‘function undefined’;
}
}
}
}

这些主要的程序写完了下面看我们这么用我们现在写好的方法。


//定义一个对象我们把重载的方法绑定在这个对象上
obj = {};
//初始化我们的需要重载的方法
overLoad(obj,’saying’,function(){
console.log(‘Abner is a good boy’);
});
overLoad(obj,’saying’,function(name,gender){
console.log(name + ‘ is a good ‘+ gender);
});
//下面是调用我们写好的方法
obj.saying(); //Abner is a good boy
obj.saying(‘xx’,’girl’) //xx is a good girl

总结

这里实现重载我们用了一个很关键的技术就是闭包,闭包是一个十分神奇的技术,当我们第一次定义重载方法的时候变量old是等于old的但是第二次的时候old是一个函数了,如果我们直接不传参数使用saying方法那么程序就会去old存储的方法,最后找到无参数的方法并调用它。是不是很神奇。好了重载我们就说到这。如果有什么问题可以在下面评论我看到会及时回复。谢谢。

node.js 与 javascript

Javascript 和 node.js 的关系

我们都知道node.js和Javascript两者有这一定的关联,是的,node.js不是一种语言,node.js是一个平台把javascript这语言应用到了服务器端,这很美妙。可以用一种语言开发前端和后端的工作,这确实让一个程序员感到无比的振奋,让那些不懂得后端的人有能力也后端的程序。在今年javascript也迎来了自己的春天ES6的到来,这对javascript来说是历史性的,对于用javascript的人来说也是感到兴奋的,因为javascript增加了一些新的特性和功能,让javascript更加的强大和易用。当然随后Node.js便合并了io.js。开始支持ES6的一些特性和功能。

未完待续

这是我第一篇博客,所以先给大家打个招呼,未完待续。