月影:function扩展
作者:月影 来源:无忧脚本 发布时间:2008-05-19 12:27:00
标签:function,扩展,js
<script>
Function.prototype.$bind=function(object)
{
var callback = function (fn) {
return fn;
}
with(object)
{
return eval('callback(' + this.toString() + ')');
}
}
var obj={a:1,b:2};
var f=function (){
a=10;
b=11;
}.$bind(obj);
f();
alert(obj.a);
//----------------------------------------------------------------------------------------------------
G = {};
G.objInstanceOf = function(obj, c){
if(typeof(c) == "string")
return typeof(obj) == c;
if(obj instanceof c || c.__templete__ && obj instanceof c.__templete__)
return true;
var _interfaces = obj && obj.__interfaces__;
if(_interfaces)
for(var i = 0, len = _interfaces; i < len; i++){
if(_interfafces[i] == c)
return true;
}
return false;
};
G.objectAsPrototype = function(obj, c){
c = c || function(){};
c.prototype = obj;
return c;
};
Function.prototype.getPrototypeObject = function(){
var p = this.__templete__ || (this.__templete__= G.objectAsPrototype(this.prototype));
return new p();
};
Function.prototype.$pextends = function(p){
var me = this.$bind({$super:p});
var ins = function()
{
var ret = me.apply(this, arguments);
return ret;
}
ins.prototype = p.getPrototypeObject();
return ins;
};
//--------------------------------------------------------------------------------------------------------
function B(){};
var A = function(){
alert($super);
}.$pextends(B);
var a = new A();
//---------------------------------------------------------------------------------------------------------
Function.prototype.$verify = function(){
var me = this;
var _args = arguments;
//第一范式 [new] T <=> [new] R:function(){donothing, return T.apply},R.prototype = T.prototype
var mins = function(){
for(var i = 0, len = _args.length; i < len; i++)
{
if(!G.objInstanceOf(arguments[i],_args[i])){
throw new TypeError("函数的参数类型不匹配,位置:"+(i+1));
}
}
return me.apply(this, arguments);
}
mins.prototype = me.prototype;
return mins;
}
//-------------------------------------------------------------------------------------------------------
var foo = function(x,y){
alert(x+y);
}.$verify("number","number");
foo(1,2);
var foo2 = function(x,y){
x(y);
}.$verify(Function,"number");
//foo("error",2);
foo2(function(x){alert(x)},10);
//foo2("x","y");
var Class3 = function(x,y){
this.x = x;
this.y = y;
}.$verify("number","number");
Class3.prototype.dist2 = function(){return this.x*this.x + this.y*this.y};
var c = new Class3(10,20);
alert(c.dist2());
//--------------------------------------------------------------------------------------------------------
Function.prototype.$staticable = function()
{
var me = this;
var cache = [];
var index = 0;
var mins = function(){
mins.alloc = function(){
cache[index] = cache[index] || {};
return cache[index++];
};
var ret = me.apply(this, arguments);
mins.alloc = null;
index = 0;
return ret;
}
mins.prototype = me.prototype;
return mins;
}
//----------------------------------------------------------------------------------------------------------
var Test = function(){
var x = Test.alloc();
x.a = x.a || 0;
x.a++;
return x.a;
}.$staticable();
for(var i = 0; i < 10; i++)
alert(Test());
//-----------------------------------------------------------------------------------------------------------
Function.prototype.$protected = function(){
var me = this;
var mins = function(){
var p = me.getPrototypeObject();
var ret = function(){}; //create a new object
for(var each in mins.prototype) //clone prototypes
{
if(mins.prototype[each] instanceof Function){
ret.prototype[each] = function(){
return mins.prototype[each].apply(p,arguments); //call by p
}
p[each] = mins.prototype[each];
}
else{
p[each] = ret.prototype[each] = mins.prototype[each];
}
}
me.apply(p,arguments);//clone a new object by me
return new ret(); //return this object;
}
return mins;
}
//----------------------------------------------------------------------------------------------------------------
//将一个类型的this域声明为全部私有
var Test = function(x,y)
{
this.x = x;
this.y = y;
}.$protected();
Test.prototype.getX = function(){
return this.x;
}
var t = new Test(5,10);
alert(t.x);
alert(t.getX());
</script>
0
投稿
猜你喜欢
- 如何准确地获得一个整数?当然可以,Format就是做这个的“专家”:function NumbersOnlyNoDecimals(
- 可以采用exec方法注意:使exec不能返回一些变量的值,而且当前的变量值在exec的语句里无效。declare @tempStr
- <!--#include file="config.asp" -->&nbs
- 当你连接到MySQL服务器时,你应使用一个密码。密码不以明文在上传输。客户端连接序列中的密码处理在MySQL 4.1.1中已经升级,很安全。
- 孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslog
- 各位想必都知道,onfocus="this.blur()"这条代码能消除链接时的虚线框,但你有没有想过,如果你的网页上有
- 如何检测某个对象是否有某个属性?第一想到的——没错,in:"prop" in obj这很完美,不过,还有不少人热衷下面的
- 今天在写BLOG的Trackback时,需要用到当前页的URL地址,并且包括?后的所有参数。在网上看到以下的这段ASP代码,它的
- 现在有一个xml,格式如下: 代码如下:<date> <item> <id>&nbs
- A.截取从字符串左边开始N个字符 Declare @S1 varchar(100) Select @S1='http://www.x
- Q. How can I restrict access to my SQL Server so that it only allows c
- 最近设计一个优惠券列表,有个属性是有效日期,因为空间有限,必须要把开始日期和结束日期在一行显示,这样就出现一排的数字,日期有好几种我们习惯的
- 因为写js经常需要用到访问样式,我们常用的做法是通过 DOM.style.XXX来读写样式信息的。可是DOM.style这种写法只能访问&l
- Macromedia Dreamweaver MX 2004提供了更多功能强劲的可视化设计工具、应用开
- 一.链接打开方式1、新窗口打开优点:用户点链接的时候,当前浏览的内容不会被替换,不需要通过前进、后退去看自己看过的内容;缺点:访问一会,就会
- 代码如下: function astro(birth) astro="" if birth=""
- 本节笔者主将要介绍Active Server Page的另一对象Response,Response对象的作用是在向浏览器发送数据。将Resp
- CSS命名规范一.文件命名规范全局样式:global.css;框架布局:layout.css;字体样式:font.css;链接样式:link
- 近日,有朋友一直打听flash连结服务器相关的知识,搞得我忧心重重,重点是自己也忘记了,大部分Flash的相关开发都是两年前的事,而且fla
- 索引是加速表内容访问的主要手段,特别对涉及多个表的连接的查询更是如此。这是数据库优化中的一个重要内容,我们要了解为什么需要索引,索引如何工作