精华内容
下载资源
问答
  • PHP5.2不用Runkit 给类动态添加方法js的对象可以动态添加方法. PHP5.2可用Runkit 给类添加方法. 而到php5.3,增加了闭包的语法. 可以直接动态添加方法.由于Runkit 是PECL的,一般无法直接使用.所以,...

    在PHP5.2中不用Runkit 给类动态添加新方法

    js中的对象可以动态添加方法. 在PHP5.2中可用Runkit 给类添加方法. 而到php5.3,增加了闭包的语法. 可以直接动态添加方法.

    由于Runkit 是在PECL中的,一般无法直接使用.所以,在在PHP5.2中,也就受到了限制. 所以,人们说PHP5.2仍不是动态结构语言.

    而js中的对象可以动态添加方法,这对于精简代码,减少继承与扩展,对人总有吸引力.

    是否真的不能动态添加呢.其实是可以的,只不能人们没有找到实现的方法.

    现在我们就讲解一下,如何动态添加:

    class ActiveStruct {

    var $lambda=array(); //定义保存动态方法的数组

    //定义动态添加方法的方法

    function addFunction($name,$code) {

    $func=create_function('',$code);

    $this->lambda[$name] = $func;

    }

    //为动态添加的方法增加调用接口

    function __call($name,$args){

    if (array_key_exists($name,$this->lambda)){

    $func = $this->lambda[$name];

    return $func($args);

    }

    }

    }

    //创建对象

    $objAcst = new ActiveStruct();

    //添加新方法

    $objAcst->addFunction('newFunc', '$vars = func_get_args(); return ($vars[0][0].$vars[0][1]);');

    //对新方法进行测试

    $testResult=$objAcst->newFunc('Hello,',' Php! ');

    echo($testResult);

    ?>

    需要注意的是, 使用这一方式,动态添加的方法,我们不能显式声明变量的个数.而在动态添加的方法内部.要获取传入的参数,只能通过:

    $vars = func_get_args();

    无论多少个变量,传入的参数均是在$vars[0]中

    所以,要了解传入多少个参数,那就需要用 count($vars[0]);

    对参数的使用则是:

    $vars[0][0], $vars[0][1], 依次类推.

    另外的不足,则是,因为是用create_function实现的,所以,代码要写成字串.

    其次则是 __call函数使用,会影响效率.

    尽管如此,却为你能够在虚拟主机的空间,使方法能动态添加成为可能! 所以, 需要时,还是可以用的.

    当然,如果你有更好的改进办法, 也请你告诉我!

    展开全文
  • 开头的一句话是:扩展方法是让我们不改变原有代码的情况下动态添加方法的方式,这给面向对象设计 模块设计带来了质的提升 很明显,扩展方法在框架设计或者平时码代码,是能够提升我们整个架构的灵活性的 简介 ...
  • 我们学习分类的时候会学到一点:分类不能声明成员变量深入浅出理解分类(category)和类扩展(extension),但是我们的实际运用,有的时候确实需要一个全局变量供各个不同的方法间传值调用,那么分类一定不能声明...

    文章转载自http://www.jianshu.com/p/7e92471c9b90

    分类是一种很好的扩展类的方式,我们学习分类的时候会学到一点:分类不能声明成员变量深入浅出理解分类(category)和类扩展(extension),但是在我们的实际运用中,有的时候确实需要一个全局变量供各个不同的方法间传值调用,那么分类中一定不能声明成员变量了么?

    其实我们可以在分类中声明成员变量,不过要添加一些代码,下面让我们来添加试试看。

    本文受到文章iOS分类中通过runtime添加动态属性启发,提供一下比较适合新手的添加方式以及原因。
    1.首先让我们定义一个类Children和Children类的分类Children_eat,我们假设这样一个场景,家里有两个小朋友,他们午饭要吃大虾,每个人有10只大虾,吃完午饭后要告诉妈妈他们吃了几只。
    2.我们知道Children_eat类中要有两个方法,a.-(void)eatShrimp b.-(void)tellMother,这个时候我们需要一个变量大虾Shrimp,它不能是一个static变量,因为每个小朋友十个虾,而不是共有十个虾,不能共用变量。
    3.在头文件中我们定义一个assign型的成员变量shrimp,两个方法,eatShrimp和tellMother.

    这里写图片描述
    4.在.m文件中,首先添加头文件,第二步为变量配置固定地址,这里有很多种写法,有兴趣可以百度一下。

    这里写图片描述
    5.下面让我们来使用这个变量,看看他能否真的被使用。
    5.1首先来写eatShrimp方法和tellMother方法的实现。

    eatshrimp3.png

    5.2我们在main函数中写一个例子,假设两个孩子,Allen和Mike一起吃中饭。

    这里写图片描述
    5.3让我们看一下结果,可以看出来shrimp这个成员变量被操作了。

    eatshrimp5.png
    6.我们再试着定义一个NSString类型的变量str,看看它和int型的写法有什么不同。下面实现中添加一行使用str。

    eatshrimp6.png
    7.让我们运行一下

    eatshrimp7.png
    8.现在我们可以方便的使用分类来拓展类,并且可以定义变量来使用了~

    展开全文
  • 实际开发当中,当JavaScript内置的那些类所提供的动态方法动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中方法和属性。 一、扩展JavaScript内置...

        在​J​a​v​a​S​c​r​i​p​t​中​可以使​用​类的p​r​o​t​o​t​y​p​e属性来​扩​展​类的属​性​和​方​法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性。

    一、扩展JavaScript内置类,添加动态方法

    语法格式:

      类名.prototype.方法名 = function([param1],[param2],....[paramn]) {

        .................

      }

      [param1],[param2],....[paramn]这些参数都是可选的

      使用这种方式给类添加的扩展方法都是动态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,不能用"类名.方法名"的形式去调用!

    1.1、使用prototype属性扩展String类

      String类是JavaScript内置的一个类,但是这个String类没有quote方法,此时就可以使用String类的prototype属性去扩展String类了,为String类添加一个实例方法(动态方法),这样每一个String类对象就都有quote方法了,这就达到了将String类扩展的效果,增强了String类的使用。

    复制代码
    1 /*扩展为String类,为String类增加quote(两边加字符)方法*/
    2         String.prototype.quote = function(quotestr) {
    3             if (!quotestr) {
    4                 quotestr = "\"";
    5             }
    6             return quotestr + this + quotestr;
    7         };
    复制代码

    测试String类新添加的quote方法

    1 alert("abc".quote());      
    2 alert("abc".quote("|"));

    测试结果:

    1.2、使用prototype扩展Number类

    1 Number.prototype.add=function(n){
    2     //哪个对象调用this所在的函数,那么this代表的就是哪个对象实例
    3     return this+n;
    4 }

    测试Number类新添加的add方法

    1 var i= new Number(10);//等价于var i=10;
    2 alert("i.Add(10).Add(30)的结果是:"+i.Add(10).Add(30));
    3 var b=40;
    4 alert("b.Add(90)的结果是:"+b.Add(90));

    测试结果:

    1.3、使用prototype扩展Array类

    复制代码
     1 Array.prototype.findVal=function(val){
     2         var index=-1;
     3         //哪个对象调用this所在的函数,那么this代表的就是哪个对象实例
     4         for(var i=0;i<this.length;i++){
     5             if(val==this[i]){
     6                 index=i;
     7                 break;
     8             }
     9         }
    10         return index;
    11     }
    复制代码

    测试Array类新添加的findVal方法

    1 var arr = new Array();
    2 arr[0]="孤傲苍狼";
    3 arr[1]="白虎神皇";
    4 arr[2]="灭世魔尊";
    5 alert("arr.FindVal(\"白虎神皇\")返回的索引是:"+arr.FindVal("白虎神皇"));

    测试结果:

      以上三个小例子就是使用类的prototype属性扩展了String类,Number类,Array类,分别给这三个类添加了本身不存在的quote,add,findVal方法,JavaScript所有的类都可以使用prototype去扩展,当觉得类本身提供的方法和属性不满足实际应用需求时,就可以根据需要进行扩展,为类添加新的方法和属性,增强类的使用功能!

    二、扩展JavaScript内置类,添加静态方法

      JavaScript是可以给类添加静态的扩展方法的,语法格式如下:

      类名.方法名 = function([param1],[param2],....[paramn]) {

        .................

      }

      [param1],[param2],....[paramn]这些参数都是可选的

      使用这种方式给类添加的扩展方法都是静态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,而静态方法是针对类的,用"类名.方法名"的形式去调用!

      C#中的String类有一个静态的Format方法非常强大,在拼接字符串时特别方便,JavaScript的String类并没有Format方法,但是我们可以去扩展String类,为String类添加类似C#中的String类的静态的Format方法

    范例:扩展String类,添加Format静态方法,模仿C#中的String.Format方法

    复制代码
     1 // ----------------------------------------------------------------------
     2 // <summary>
     3 // 扩展String类,添加Format静态方法,模仿C#中的String.Format方法
     4 // </summary>
     5 // <returns>str</returns>
     6 // ----------------------------------------------------------------------
     7 if (!String.Format) {
     8     String.Format = function () {
     9         if (arguments.length == 0) {
    10             return null;
    11         }
    12         var str = arguments[0];
    13         if (arguments[1] instanceof Array) {
    14             var arr = arguments[1];
    15             for (var i = 0; i < arr.length; i++) {
    16                 var re = new RegExp('\\{' + i + '\\}', 'gm');
    17                 str = str.replace(re, arr[i]);
    18             }
    19         } else {
    20             for (var i = 1; i < arguments.length; i++) {
    21                 var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
    22                 str = str.replace(re, arguments[i]);
    23 
    24             }
    25         }
    26         return str;
    27     }
    28 }
    复制代码

    测试为String类扩展的Format静态方法

    1 var str="我是{0},我在总结{1}和{2}的学习,我很喜欢{3}这2门语言!";
    2 //使用"类名.方法名"的形式去调用类的静态方法
    3 str = String.Format(str,"孤傲苍狼","java","JavaScript","'java'和'JavaScript'");//把str中的占位符{0},{1},{2},{3}用具体的内容替换掉
    4 alert(str);

    运行结果:

      

      这个小例子就是扩展了String类,给String类添加了一个静态的Format方法,JavaScript所有的类都可以添加静态扩展方法,当觉得类本身提供的静态方法和静态属性不满足实际应用需求时,就可以根据需要进行扩展,为类添加新的静态方法和静态属性,增强类的使用功能!

      以上就是对JavaScript编写类的扩展方法的总结,大家可以根据实际情况对JavaScript内置的那些类编写扩展方法,满足在开发中实际需求!有一个比较著名的prototype.js库就是针对JavaScript内置的那些类进行扩展,编写了大量的扩展方法!学习编写JavaScript扩展方法时,可以去多多参考prototype.js的写法,我本人现在也在看prototype.js的源码,过段时间再和大家分享我的心得吧!文章中如果有写得不对的地方,欢迎朋友们指正,感激不尽!

    展开全文
  • 实际开发当中,当JavaScript内置的那些类所提供的动态方法动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中方法和属性。 一、扩展JavaScript内置类...

      在​J​a​v​a​S​c​r​i​p​t​中​可以使​用​类的p​r​o​t​o​t​y​p​e属性来​扩​展​类的属​性​和​方​法,在实际开发当中,当JavaScript内置的那些类所提供的动态方法和动态属性不满足我们实际开发时,我们就可以通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中的方法和属性。

    一、扩展JavaScript内置类,添加动态方法

    语法格式:

      类名.prototype.方法名 = function([param1],[param2],....[paramn]) {

        .................

      }

      [param1],[param2],....[paramn]这些参数都是可选的

      使用这种方式给类添加的扩展方法都是动态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,不能用"类名.方法名"的形式去调用!

    1.1、使用prototype属性扩展String类

      String类是JavaScript内置的一个类,但是这个String类没有quote方法,此时就可以使用String类的prototype属性去扩展String类了,为String类添加一个实例方法(动态方法),这样每一个String类对象就都有quote方法了,这就达到了将String类扩展的效果,增强了String类的使用。

    复制代码
    1 /*扩展为String类,为String类增加quote(两边加字符)方法*/
    2         String.prototype.quote = function(quotestr) {
    3             if (!quotestr) {
    4                 quotestr = "\"";
    5             }
    6             return quotestr + this + quotestr;
    7         };
    复制代码

    测试String类新添加的quote方法

    1 alert("abc".quote());      
    2 alert("abc".quote("|"));

    测试结果:

    1.2、使用prototype扩展Number类

    1 Number.prototype.add=function(n){
    2     //哪个对象调用this所在的函数,那么this代表的就是哪个对象实例
    3     return this+n;
    4 }

    测试Number类新添加的add方法

    1 var i= new Number(10);//等价于var i=10;
    2 alert("i.Add(10).Add(30)的结果是:"+i.Add(10).Add(30));
    3 var b=40;
    4 alert("b.Add(90)的结果是:"+b.Add(90));

    测试结果:

    1.3、使用prototype扩展Array类

    复制代码
     1 Array.prototype.findVal=function(val){
     2         var index=-1;
     3         //哪个对象调用this所在的函数,那么this代表的就是哪个对象实例
     4         for(var i=0;i<this.length;i++){
     5             if(val==this[i]){
     6                 index=i;
     7                 break;
     8             }
     9         }
    10         return index;
    11     }
    复制代码

    测试Array类新添加的findVal方法

    1 var arr = new Array();
    2 arr[0]="孤傲苍狼";
    3 arr[1]="白虎神皇";
    4 arr[2]="灭世魔尊";
    5 alert("arr.FindVal(\"白虎神皇\")返回的索引是:"+arr.FindVal("白虎神皇"));

    测试结果:

      以上三个小例子就是使用类的prototype属性扩展了String类,Number类,Array类,分别给这三个类添加了本身不存在的quote,add,findVal方法,JavaScript所有的类都可以使用prototype去扩展,当觉得类本身提供的方法和属性不满足实际应用需求时,就可以根据需要进行扩展,为类添加新的方法和属性,增强类的使用功能!

    二、扩展JavaScript内置类,添加静态方法

      JavaScript是可以给类添加静态的扩展方法的,语法格式如下:

      类名.方法名 = function([param1],[param2],....[paramn]) {

        .................

      }

      [param1],[param2],....[paramn]这些参数都是可选的

      使用这种方式给类添加的扩展方法都是静态的,动态方法是针对类的实例对象的,所以调用必须要用"对象.方法名"的形式去调用,而静态方法是针对类的,用"类名.方法名"的形式去调用!

      C#中的String类有一个静态的Format方法非常强大,在拼接字符串时特别方便,JavaScript的String类并没有Format方法,但是我们可以去扩展String类,为String类添加类似C#中的String类的静态的Format方法

    范例:扩展String类,添加Format静态方法,模仿C#中的String.Format方法

    复制代码
     1 // ----------------------------------------------------------------------
     2 // <summary>
     3 // 扩展String类,添加Format静态方法,模仿C#中的String.Format方法
     4 // </summary>
     5 // <returns>str</returns>
     6 // ----------------------------------------------------------------------
     7 if (!String.Format) {
     8     String.Format = function () {
     9         if (arguments.length == 0) {
    10             return null;
    11         }
    12         var str = arguments[0];
    13         if (arguments[1] instanceof Array) {
    14             var arr = arguments[1];
    15             for (var i = 0; i < arr.length; i++) {
    16                 var re = new RegExp('\\{' + i + '\\}', 'gm');
    17                 str = str.replace(re, arr[i]);
    18             }
    19         } else {
    20             for (var i = 1; i < arguments.length; i++) {
    21                 var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
    22                 str = str.replace(re, arguments[i]);
    23 
    24             }
    25         }
    26         return str;
    27     }
    28 }
    复制代码

    测试为String类扩展的Format静态方法

    1 var str="我是{0},我在总结{1}和{2}的学习,我很喜欢{3}这2门语言!";
    2 //使用"类名.方法名"的形式去调用类的静态方法
    3 str = String.Format(str,"孤傲苍狼","java","JavaScript","'java'和'JavaScript'");//把str中的占位符{0},{1},{2},{3}用具体的内容替换掉
    4 alert(str);

    运行结果:

      

      这个小例子就是扩展了String类,给String类添加了一个静态的Format方法,JavaScript所有的类都可以添加静态扩展方法,当觉得类本身提供的静态方法和静态属性不满足实际应用需求时,就可以根据需要进行扩展,为类添加新的静态方法和静态属性,增强类的使用功能!

      以上就是对JavaScript编写类的扩展方法的总结,大家可以根据实际情况对JavaScript内置的那些类编写扩展方法,满足在开发中实际需求!有一个比较著名的prototype.js库就是针对JavaScript内置的那些类进行扩展,编写了大量的扩展方法!学习编写JavaScript扩展方法时,可以去多多参考prototype.js的写法,我本人现在也在看prototype.js的源码,过段时间再和大家分享我的心得吧!文章中如果有写得不对的地方,欢迎朋友们指正,感激不尽!

    转载于:https://www.cnblogs.com/ronghua/p/10681936.html

    展开全文
  • Python中动态添加类的属性或成员函数我们有时需要让类动态添加属性或方法,比如我们做插件时就可以采用这种方法。用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块。这方面可以参考...
  • Java我们一般会使用new关键字实例化对象然后调用该对象所属提供的方法来实现相应的功能,比如我们现在有个主类叫Web这个中能实现各种方法,比如用户注册、发送邮件等功能,代码如下:上面的代码简单的通过...
  • 扩展方法详解

    2010-05-24 18:23:00
    扩展方法是一种特殊的静态方法,调用扩展方法与调用类型实际定义的方法之间没有明显的差异。扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,使得附加的方法扩展已存在类型和构造类型成为可能。他...
  • 扩展方法

    2010-03-10 20:20:00
    我们知道,一但一个类型(例如:、接口、结构、枚举或者委托)被定义然后编译进一个.net程序集后,它的定义工作就应该说是结束了。 为该类型添加成员。更新成员或者删除成员,唯一... C#3.0,可以把方法定义...
  • OC中,我们可以通过Category 对已有的类进行扩展,这得益于OC的Runtime机制,让类可以‘动态’的添加方法...但是,Category中我们无法向已有的类中添加属性,本文就介绍两种如何Category中“添加”属性的方法
  • 【转】扩展方法详解

    2010-09-13 16:00:00
    扩展方法是一种特殊的静态方法,调用扩展方法与调用类型实际定义的方法之间没有明显的差异。扩展方法是可以通过使用实例方法语法调用的静态方法。效果上,使得附加的方法扩展已存在类型和构造类型成为可能。他...
  • 实际需求:开发过程中,JavaScript内置的类所提供的动态方法和...具体方法:通过"prototype"属性给自定义类添加方法和属性或者扩展原有的类中方法和属性。 一、扩展JavaScript内置类,添加动态方法 语法格式:
  • 包括Cocoa框架的任何,我们都可以对其进行扩展,这是从Smalltalk(oc的鼻祖)继承过来的,跟C#扩展方法比较像。 不谈历史,先来看下用分类进行私有成员的表现。 #import "ViewController.h" @interface ...
  • 本文介绍了.NET 3.5扩展方法的一些特性,创建方法,优点以及存在的一些限制。...原本,我听说 Partial Class 的时候,以为可以为已存在的类添加方法了,不过,Partial Class 只能同一个 Assembly 之的要求,
  • 最近写一个扩展右键菜单的插件,既然是插件,想着一步到位,把相关的style样式设置都丢进js文件,直接加载一个js文件便可以使用该插件,所以今天就研究了下js批量的插入样式的方法,即addSheet(),顺便总结下...
  • XsltArgumentList 包含 XSLT 参数和 XSLT 扩展对象。传入 Transform 方法后,这些参数和扩展对象可以从样式表... (但是不能动态的修改其中的函数或者是业务,最好还是样式表添加脚本) 支持调用属于其他命名空
  • 简单来说,extension.m文件中添加,所以其权限为private,所以只能拿到源码的添加extension。另外extension是编译时决议,和interface和implement里的代码融合一块了一般。 category(类别) category能...
  • oc 类别 与 类扩展

    千次阅读 2016-05-05 17:04:07
    尤其是为系统进行拓展的时候,我们可以不用继承系统,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。 #import @interface NSObject (Category) - (void)myMethod; @end ...
  • 还可以使用反射,从编译时还不清楚的类型中动态创建实例。下一个示例显示了创建Calculator的一个实例,而编译器编译时不知道这种类型。程序集CalculatorLib是动态加载的,没有添加引用。运行期间,实例化...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 980
精华内容 392
关键字:

在动态类中添加扩展方法