javascript中的call方法

该方法应用于function对象(即function本身或者通过new关键字创建的function实例)

该方法的第一个用途是调用一个对象的一个方法(非常的干巴巴是不是?官方解释往往都不说人话,看下面的例子即可):

function add(a,b){
        document.write(a + b);
}
function sub(a,b){
        document.write(a - b);
}
add.call(sub,3,1);

页面输出结果为:4
所以到这儿可有这样的总结:call方法可以由函数A来调用,调用之后传入若干参数,第一个参数为函数B,第二、三个参数为函数要执行时的参数,call方法执行的结果是函数A替换掉函数B的函数体内容,所以上面的例子执行了相加的运算而不是相减的
这个功能用来干什么?感觉好废的样子有没有?莫慌,有意思的在下面

function Class1(){
        this.name = "Sam";
        this.showName = function(){
                alert(this.name);
        }
}
function Class2(){
        this.name = "Jack";
}

然后创建一个Class1的实例

var c1 = new Class1();
c1.showName();

页面输出"Sam",没有任何问题
然后再创建一个Class2的实例

var c2 = new Class2();
c1.showName.call(c2);

页面输出"Jack"
这个结果貌似有点惊悚,Class2的实例居然可以通过一个call方法调用Class1的私有方法,不过惊悚过后有没有觉得这个功能和某个javascript里面没有但在其它编程语言中很重要的一个功能很像?
接着往下看

function Class1(){
        this.sayHi = function(txt){
                alert(txt);
        }
}
function Class2(){
        Class1.call(this);
}

然后创建一个Class1的实例

var c1 = new Class1();
c1.sayHi("hello,Jack");

页面输出"hello,Jack",没有任何问题
然后再创建一个Class2的实例

var c2 = new Class2();
c2.sayHi("hello,Sam");

页面输出"hello,Sam"
代码写到这里,"继承"这个词已经浮出水面,在Class2中加了一句Class1.call(this)就使Class2继承了Class1的属性和方法,javascript就是靠call方法来模拟继承的概念
Class1.call(this);这句代码中的this即是指当前对象就是Class1本身,Class1.call即是用Class1的对象代替当前的Class2对象(网上有的文章叫“对象冒充”),所以Class2的实例拥有了Class1的属性和方法
需要说明的是,我觉得用“替换”这个词不准确,如果Class2同时还拥有自已的属性和方法,那这些属性和方法肯定也是一直存在的,如果用“替换”会让人想到把Class2本身的属性和方法干掉,但暂时想不到更合适的描述,姑且先这样记着
这是最基本的继承,javascript里的继承可不可以更酷一点?看下面代码

function Class1(){
        this.sayHi = function(){
                alert("hello,world");
        }
}
function Class2(){
        Class1.call(this);
}
function Class3(){
        Class2.call(this);
}

然后创建一个Class3的实例

var c3 = new Class3();
c3.sayHi();

页面居然输出了"hello,world"!
这样,通过call方法,javascript还实现了江湖上失传已久的多重继承。

时间: 2024-08-27 17:58:55

javascript中的call方法的相关文章

javascript中的toString()方法

javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘. (1)Array.toString():将数组转换成一个字符串,并且返回这个字符串.描述:当数组用于字符串环境中时,javascript会调用这一方法将数组自动转换成一个字符串.toString()在把数组转换成字符串时,首先要将数组的每个元素都转换成字符串(通过调用这些元素的toString方

javascript 中关于call方法的详解。

关于javascript中的call方法,网上查了一些资料总是不得详解.总结网上的观点,call有两个妙用: 1: 继承.(不太喜欢这种继承方式.) 2: 修改函数运行时的this指针. js中关于call的解释如下: js关于call的这份文档容易让人迷糊.而<javascript权威指南>对call的描述就比较容易理解了. 注意红色框中的部分,f.call(o)其原理就是先通过 o.m = f 将 f作为o的某个临时属性m存储,然后执行m,执行完毕后将m属性删除. 如 function f

Javascript中,数学方法可以分成以下几类: constans(常数)、power functions(乘方函数)、trigonometic functions(三角函数)、rounding functions(舍入函数)、random numbers(随机数字)

在Javascript中,数学方法可以分成以下几类: constans(常数).power functions(乘方函数).trigonometic functions(三角函数).rounding functions(舍入函数).random numbers(随机数字) 常数和乘方函数 Math.E 自然对数的底(为常数) 2.718 Math.LN10 10的自然对数 2.302 Math.LN2 2的自然对数 0.693 Math.PI 圆周率 3.1415 Math.SQRT1_2 1/

JavaScript中的工厂方法、构造函数与class

JavaScript中的工厂方法.构造函数与class 本文转载自:众成翻译 译者:谢于中 链接:http://www.zcfy.cc/article/1129 原文:https://medium.com/javascript-scene/javascript-factory-functions-vs-constructor-functions-vs-classes-2f22ceddf33e#.wby148xu6 在ES6出现之前,人们常常疑惑JavaScript中的工厂模式和构造函数模式到底有

javascript中的sort()方法

非原创,转载于博客园 现在在学习javascript中,发现sort()函数是有点奇怪的东西(可能是本人水平的问题-_-!),于是就在这里记录一下自己找到的东西吧.sort()这个方法的参数很奇怪,必须是函数,但也是可选参数,如果没有参数的话,就会默认以字符串的字典顺序来排列(就算是数值,也会被转化为字符串来处理).这个参数是要能够比较两个值的大小,如: function sortNumber(a, b){   return a - b; //这里返回的是他们的差值,如果是小于0的值,就会将a排

Java和JavaScript中使用Json方法大全

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON採用全然独立于语言的文本格式,可是也使用了相似于C语言家族的习惯(包含C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写.同一时候也易于机器解析和生成

javascript中常用数组方法详细讲解

javascript中数组常用方法总结 1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔数组的各个元素.如果不指定分隔符,默认使用逗号.案例如下: var a=[1,2,3]; a.join();//=> "1,2,3" 因为没有指定分隔符,默认为逗号. a.join("+");//=> "1+2+3" 指定分隔符为+ a.

javascript 中 call apply 方法的区别

function foo(arg1, arg2, arg3){ alert(art1 + arg2 + arg3); } foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3) call , apply 都属于 Function.prototype的一个方法, 它是JavaScript引擎内在实现的, 因为属于 Function.prototype  所以每个Functi

【转】详解JavaScript中的异常处理方法

有三种类型的编程错误:(1)语法错误和(2)运行时错误(3)逻辑错误:语法错误: 语法错误,也被称为解析错误,在编译时进行传统的编程语言,并出现在JavaScript解释时. 例如,下面一行将导致一个语法错误,因为它缺少一个右括号: <script type="text/javascript"> <!-- window.print(; //--> </script> 当一个语法错误在JavaScript中出现,只有在同一个线程中包含的语法错误的影响,