`
jackchen0227
  • 浏览: 146786 次
  • 性别: Icon_minigender_1
  • 来自: 帝都
社区版块
存档分类
最新评论

[zz]javascript中apply方法和call方法的作用

阅读更多

说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。

call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。

func.call(func1)//中this.指向的不是func,而是func1

对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。


(reference:http://www.cnblogs.com/beyondnet/archive/2007/12/06/985216.html)

 

TEST:

function cls1()
{
   this.b='111';
   this.c ='222';
   this.d ='333';
   this.f = function()
   {
       alert("nihao");
}
}

function cls2()
{
   this.a='aaa';
  
   cls1.apply(this); //这里用的是类(也可直接看成函数)直接来apply的。不是用实例。此时,cls2类拥有                                cls1类的所有属性和方法.
  
}
var st = new cls2();

alert(st.d);

 


alert(this.sim_name);
}                     

handleSPA('55555555');

 

 

call方法在msdn中的解释   调用一个对象的一个方法,以另一个对象替换当前对象。

apply方法在msdn中的解释 应用某一对象的一个方法,用另一个对象替换当前对象。

这个解释也是非常抽象的,这两个方法的作用基本是一样的,举个例子

<script>
function cls1()
{
   this.a='123';
}
cls1.prototype.fun1=function()
{
   alert(this.a);
}
function cls2()
{
   this.a='456';
}
var o1=new cls1();
var o2=new cls2();
o1.fun1.apply(o2); //这里用的是实例名,如果写成 o1.apply(o2)则报错
</script>

只有o1对象的类cls1中有fun1这个方法,但是,这时我们需要用o2对象替代o1对象,所以这个时候显示的this.a会是456,呵呵很神奇吧,换成call方法也是一样的,这两种方法使用的不同点仅仅是参数的使用方法上不同,这里就不多做解释了。

大家可以在prototype.js里看到
var Class = {
   create: function() {
     return function() {
       this.initialize.apply(this, arguments);
     }
   }
}
这种代码,相当的夸张,很多人很容易被这种bt的代码弄糊涂,其实仔细分析其中的道理却也不难

显然这种写法代表了Class是声明的一个Object对象,其中create是这个object对象的一个属性,这个属性就是一个函数。这个函数执行过后返还一个函数。可能这样解释太复杂了,那不如做一个试验好了。

<script>
var x=function(){return function(){alert(123);}}
var n=x();
n();
</script>
很好玩吧,这里n就是x函数执行过后返还给的一个函数也就是n现在等于了function(){alert(123);}再执行n()的时候就跳出了123

现在开始讲难点 this.initialize.apply(this, arguments);

这句表达了什么含义,其实现在先看看prototype.js里怎么调用的就明白了

var Template = Class.create();

Template.prototype = {
   initialize: function(template, pattern) {
     this.template = template.toString();
     this.pattern   = pattern || Template.Pattern;
   },....省略代码若干

var template = new Template(replacement);

第一句话Class.create(); 就是返还给Template 一个函数,这个函数是
function() {
       this.initialize.apply(this, arguments);
     }
当执行var template = new Template(replacement);时,就变成了要执行这个函数,而这个函数的作用是
执行当前类中initialize这个函数

所以prototype.js中的每一个类都预留了
Template.prototype = {
   initialize: function(template, pattern) {
     this.template = template.toString();
     this.pattern   = pattern || Template.Pattern;
   },....
这么个函数,如果没有这个的话,程序将会出错

知其然,知其所以然,为什么要这么写呢?

一般我们声明的时候funciton fun(){} var o=new fun();这样感觉fun又是类又是构造函数很别扭,为了分开这种不是很友好的代码方案,所以prototype.js使用了如上方法

分享到:
评论

相关推荐

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    ZzJavaScript encode and escape functions

    JavaScript中的编码和转义函数主要有encodeURI、encodeURIComponent和escape这三个函数,它们用于处理URL和URI中的特殊字符。下面将详细介绍这三个函数的功能和使用场景。 首先,encodeURI函数的主要用途是编码整个...

    ZZ: 时间管理方法(转贴)

    标题中的“ZZ: 时间管理方法(转贴)”表明这是一篇关于时间管理的文章,可能是从其他地方转载而来。从描述中的“博文链接:https://lkfnn.iteye.com/blog/33600”我们可以推测,这是一篇在ITeye技术社区发表的博客...

    W3C Javascript 最新Chm格式手册

    JavaScript中的函数不仅可以作为值传递,还可以作为对象属性或在其他函数内部定义。对象是键值对的集合,它们使得我们可以封装数据和相关的操作。 DOM是HTML和XML文档的一种编程接口,JavaScript通过DOM可以访问和...

    超出NLO QCD的高横向动量的ZZ产生

    使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的贡献。 最重要的是,我们将来自胶子-胶子通道的胶子-融合ZZ + jet贡献添加到我们的合并...

    zz809.com留言本

    源代码的分享是IT领域中常见的学习和交流方式,本资源作为“源代码”和“源码”,对于开发者来说具有很高的研究价值。它不仅可以让开发者了解留言本系统的内部运行机制,还能为他们提供一个实战性的学习案例,以便于...

    ZZ561401.CAB

    ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB

    华为流程管理和持续优化方法论zz.pptx

    华为流程管理和持续优化方法论zz.pptx

    流程优化方法课件zz.pptx

    流程优化方法课件zz.pptx

    wincc AX NF ZZ

    wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。

    ZZ_MODIFIED_GEEBINF.ENS.zip

    标题中的"ZZ_MODIFIED_GEEBINF.ENS.zip"是一个压缩包文件,暗示其内容可能包含对EndNote引用样式的一种修改。EndNote是一款流行的参考文献管理软件,它允许用户存储、组织和格式化引用文献。"ZZ_MODIFIED_GEEBINF....

    在pp碰撞中测量ZZ生产截面和Z→分支分数

    质子-质子碰撞中的四轻子产生,pp→(Z /γ⁎)(Z /γ⁎)→ℓ+ℓ-ℓ′+ ℓ′-,其中ℓ,ℓ′= e或μ,在 大型强子对撞机的CMS检测器的质心能量为13 TeV。 数据样本对应于2.6 fb $ ^ {-1} $的综合亮度。 对于具有两...

    fizzbuzz-js:JavaScript中的FizzBu​​zz

    JavaScript中的FizzBu​​zz 问题:编写一个以一个数字作为参数的方法。 对于三的倍数,返回“嘶嘶声”,对于五的倍数,返回“嗡嗡声”。 对于三和五的倍数的数字,返回“ FizzBu​​zz”,在所有其他情况下,返回...

    zz CAD快速计算长度插件

    在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。

    ZZ Fibo Trader - MetaTrader 5EA.zip

    在ZZ Fibo Trader中,它会自动检测之字转向(ZigZag)的波动,并在图表上绘制出斐波那契线,帮助交易者识别潜在的价格反转点,从而制定入场和出场策略。 其次,抛物线止损与反转向指标(Parabolic SAR)是另一大...

    ASP.ENT中应用javascript分页

    pageno=pageall}//输入页和当前页都=最大页 document.getElementById("all").innerHTML="";//全部清空 for(var i=0;i;i++) { var div =document.createElement("li");//建立div对象 div.innerHTML=zz[(e-1)*...

    ZZ_MODIFIED_GEEBINF.ENS.zip endnote的样式文件

    标题中的“ZZ_MODIFIED_GEEBINF.ENS.zip”是一个压缩包文件,主要包含一个名为“ZZ_MODIFIED_GEEBINF.ENS”的文件。这个文件是一种特殊格式,用于定义EndNote的引用样式。EndNote是一款强大的文献管理软件,广泛应用...

    javascript宝典(经典中的经典)

    javascript宝典,学习javascript利器。拥有它,轻松搞定javascript。此书内容较多,共三册,请一起下载,然后解压,单独解压无效。

Global site tag (gtag.js) - Google Analytics