说明白一点其实就是更改对象的内部指针,即改变对象的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 zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
JavaScript中的编码和转义函数主要有encodeURI、encodeURIComponent和escape这三个函数,它们用于处理URL和URI中的特殊字符。下面将详细介绍这三个函数的功能和使用场景。 首先,encodeURI函数的主要用途是编码整个...
标题中的“ZZ: 时间管理方法(转贴)”表明这是一篇关于时间管理的文章,可能是从其他地方转载而来。从描述中的“博文链接:https://lkfnn.iteye.com/blog/33600”我们可以推测,这是一篇在ITeye技术社区发表的博客...
JavaScript中的函数不仅可以作为值传递,还可以作为对象属性或在其他函数内部定义。对象是键值对的集合,它们使得我们可以封装数据和相关的操作。 DOM是HTML和XML文档的一种编程接口,JavaScript通过DOM可以访问和...
使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的贡献。 最重要的是,我们将来自胶子-胶子通道的胶子-融合ZZ + jet贡献添加到我们的合并...
源代码的分享是IT领域中常见的学习和交流方式,本资源作为“源代码”和“源码”,对于开发者来说具有很高的研究价值。它不仅可以让开发者了解留言本系统的内部运行机制,还能为他们提供一个实战性的学习案例,以便于...
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
华为流程管理和持续优化方法论zz.pptx
流程优化方法课件zz.pptx
标题中的"ZZ_MODIFIED_GEEBINF.ENS.zip"是一个压缩包文件,暗示其内容可能包含对EndNote引用样式的一种修改。EndNote是一款流行的参考文献管理软件,它允许用户存储、组织和格式化引用文献。"ZZ_MODIFIED_GEEBINF....
在安全生产主要负责人职责方面, ZZ 公司强调了不同层级的负责人在安全生产中的职责和作用。部门主要负责人需制定并执行安全生产制度,同时负责检查和监督;班组长和安全员则要协助领导执行法规和制度,并负责监督...
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
质子-质子碰撞中的四轻子产生,pp→(Z /γ⁎)(Z /γ⁎)→ℓ+ℓ-ℓ′+ ℓ′-,其中ℓ,ℓ′= e或μ,在 大型强子对撞机的CMS检测器的质心能量为13 TeV。 数据样本对应于2.6 fb $ ^ {-1} $的综合亮度。 对于具有两...
JavaScript中的FizzBuzz 问题:编写一个以一个数字作为参数的方法。 对于三的倍数,返回“嘶嘶声”,对于五的倍数,返回“嗡嗡声”。 对于三和五的倍数的数字,返回“ FizzBuzz”,在所有其他情况下,返回...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
在ZZ Fibo Trader中,它会自动检测之字转向(ZigZag)的波动,并在图表上绘制出斐波那契线,帮助交易者识别潜在的价格反转点,从而制定入场和出场策略。 其次,抛物线止损与反转向指标(Parabolic SAR)是另一大...
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”是一个压缩包文件,主要包含一个名为“ZZ_MODIFIED_GEEBINF.ENS”的文件。这个文件是一种特殊格式,用于定义EndNote的引用样式。EndNote是一款强大的文献管理软件,广泛应用...