TO:Lostinet(迷失网络) 重载是指允许多个同名的函数名存在,但通过不同的形参实现不同的操作,运算符重载特殊。最简单的例子: function go(){ alert('null'); } function go(a){ alert('a='+a); } function go(a,b){ alert('a='+a+'||b='+b); } 试试看,js允许这样写执行的永远是最后一次定义的函数,后进先出,没有关于js的比较好的书籍找到关于js的更具体的解释(至少没有提到重载问题),你所说的我觉得只是宏,另外js和vbs都提供了函数内联,查一下MSDN,可以找到,我认为不是重载
<script> function go(){ var s=97,arr=[]; for(i=0;i<arguments.length;i++) arr[i]=String.fromCharCode(s+i)+"="+arguments[i]; alert(arr.join("||")) } go(1,2,3,4) </script>
alert(MyClass().r);
alert(MyClass().r);
alert(MyClass().r);
alert(MyClass().r);
不过这个
var fs=function(fs){return fs.caller};fs=fs(fs);
写成:
var fs=new function(){return this.constructor.caller}();
也不错哦。
你所提及的SINGLETON模式,它是希望保证每个类只有一个实例,并且提供一个访问它的全局访问点。
在js中,你所能做的无非就是对“函数”作协内联和宏之类的操作,我不知道js到底采用什么机制运行,但绝大多数操作极象是宏,但在功能上比宏强大,更像是内联。这让我想起了曾经有人提问js是否支持重载,那么你说js支持重载吗?当然不,我看也谈不上使用模式。我初学者!
重载是指允许多个同名的函数名存在,但通过不同的形参实现不同的操作,运算符重载特殊。最简单的例子:
function go(){
alert('null');
}
function go(a){
alert('a='+a);
}
function go(a,b){
alert('a='+a+'||b='+b);
}
试试看,js允许这样写执行的永远是最后一次定义的函数,后进先出,没有关于js的比较好的书籍找到关于js的更具体的解释(至少没有提到重载问题),你所说的我觉得只是宏,另外js和vbs都提供了函数内联,查一下MSDN,可以找到,我认为不是重载
function go(){
var s=97,arr=[];
for(i=0;i<arguments.length;i++)
arr[i]=String.fromCharCode(s+i)+"="+arguments[i];
alert(arr.join("||"))
}
go(1,2,3,4)
</script>
你举的例子是想说明js不支持重载队吗?我是这么理解的,js的参数表“数组对象“被引用,当我想事实上不是这么调用的,arguments对象只是Array树组对象的得属性,由于存在这个属性与重载机制矛盾,至少解释器没有根据参数表来选择用那个函数匹配。
致 Lostinet(迷失网络):
首先我觉得你再这里使用模式这个词不太合适,模式一般值设计模式,基本模式如下列:
创建型:
Abstract Factory
Builder
Prototype
Singleton
结构型:
Adapter
Bridge
Composite
Decorator
Facorator
Flyweight
Proxy
行为型:
Chain of Responsibility
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
以上模式适用范围:对象。
但愿没有遗漏。
js基于Prototype模式,也就是你所创建的任何对象均为某个对象的副本,比如myarray=new Array;myarray为Array对象的副本,所有原型已经存在,而你不能重载,如果说覆盖那么它是一种[宏]而已,也就是简单的字符串替代,应该就是你说的模拟的意思。js解释执行特点决定[宏]不会具有编译执行中[宏]盲目替代的缺点。
由于js没有类,所以不可能提供[运算符重载],否则建引起混乱。
自家理解,我不想误人,毕竟我是js初学者,我只是觉得感兴趣,讨论一下,我想搞明白这个。