(转)js的call和apply

1、方法定义

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法: 
语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

2、常用实例

a、

Java代码  

  1. function add(a,b)
  2. {
  3. alert(a+b);
  4. }
  5. function sub(a,b)
  6. {
  7. alert(a-b);
  8. }
  9. add.call(sub,3,1);

这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

b、

Java代码  

  1. function Animal(){
  2. this.name = "Animal";
  3. this.showName = function(){
  4. alert(this.name);
  5. }
  6. }
  7. function Cat(){
  8. this.name = "Cat";
  9. }
  10. var animal = new Animal();
  11. var cat = new Cat();
  12. //通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
  13. //输入结果为"Cat"
  14. animal.showName.call(cat,",");
  15. //animal.showName.apply(cat,[]);

call 的意思是把 animal 的方法放到cat上执行,原来cat是没有showName() 方法,现在是把animal 的showName()方法放到 cat上来执行,所以this.name 应该是 Cat

c、实现继承

Java代码  

  1. function Animal(name){
  2. this.name = name;
  3. this.showName = function(){
  4. alert(this.name);
  5. }
  6. }
  7. function Cat(name){
  8. Animal.call(this, name);
  9. }
  10. var cat = new Cat("Black Cat");
  11. cat.showName();

Animal.call(this) 的意思就是使用 Animal对象代替this对象,那么 Cat中不就有Animal的所有属性和方法了吗,Cat对象就能够直接调用Animal的方法以及属性了.

d、多重继承

Java代码  

  1. function Class10()
  2. {
  3. this.showSub = function(a,b)
  4. {
  5. alert(a-b);
  6. }
  7. }
  8. function Class11()
  9. {
  10. this.showAdd = function(a,b)
  11. {
  12. alert(a+b);
  13. }
  14. }
  15. function Class2()
  16. {
  17. Class10.call(this);
  18. Class11.call(this);
  19. }

很简单,使用两个 call 就实现多重继承了
当然,js的继承还有其他方法,例如使用原型链,这个不属于本文的范畴,只是在此说明call 的用法。说了call ,当然还有 apply,这两个方法基本上是一个意思,区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments

说到继承,js的原型继承有:

1:默认继承

1        /**
 2          * [默认继承模式]
 3          */
 4         function Parent(name) {
 5             this.name = name || ‘Adam‘;
 6         }
 7         var parent = new Parent();
 8         Parent.prototype.say = function() {
 9             return this.name;
10         };
11         function Child(name) {}
12         Child.prototype = new Parent();
13         var kid = new Child();
14         console.log(kid.hasOwnProperty(‘name‘));//false
15         console.log(parent.hasOwnProperty(‘name‘));//true
16         console.log(kid.say());//Adam
17         kid.name = ‘lili‘;
18         console.log(kid.say());//lili
19         console.log(parent.say());//Adam

2借用构造函数
 /**
 2          * [借用构造函数]
 3          */
 4         function Article(tags) {
 5             this.tags = tags || [‘js‘, ‘css‘];
 6         }
 7         Article.prototype.say = function() {
 8             return this.tags
 9         }
10         var article = new Article();
11         function StaticPage(tags) {
12             Article.apply(this,arguments);
13         }
14         var page = new StaticPage();
15         console.log(page.hasOwnProperty(‘tags‘));//true
16         console.log(article.hasOwnProperty(‘tags‘));//true
17         console.log(page.tags);//[‘js‘, ‘css‘]
18         page.tags = [‘html‘, ‘node‘];
19         console.log(page.tags);//[‘html‘, ‘node‘]
20         console.log(article.tags);//[‘js‘, ‘css‘]
21         //console.log(page.say());//报错 undefined is not a function
22         console.log(article.say());//[‘js‘, ‘css‘]

直接跳到原型继承来讲
  /**
 2          * [原型继承]
 3          * @type {Object}
 4          */
 5         function object(proto) {
 6             function F() {}
 7             F.prototype = proto;
 8             return new F();
 9         }
10
11         var person = {
12             name: ‘nana‘,
13             friends: [‘xiaoli‘, ‘xiaoming‘]
14         };
15
16         var anotherPerson = object(person);
17         anotherPerson.friends.push(‘xiaohong‘);
18         var yetAnotherPerson = object(person);
19         anotherPerson.friends.push(‘xiaogang‘);
20         console.log(person.friends);//["xiaoli", "xiaoming", "xiaohong", "xiaogang"]21         console.log(anotherPerson.__proto__)//Object {name: "nana", friends: Array[4]}
时间: 2024-10-14 14:33:18

(转)js的call和apply的相关文章

js如何是利用apply实现继承

js如何是利用apply实现继承:javascript是一种面向对象的语言,当然继承是它的重要特征之一,比如常规的可以使用原型实现继承,不过使用apply可是可以实现继承的,下面就通过代码实例介绍一下,关于apply函数这里就不介绍了,具体可以参阅javascript的call()和apply()的作用和区别一章节. 下面看代码实例: function Parent(username){ this.username=username; this.sayHello=function(){ aler

js继承之call,apply和prototype随谈

在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am join"; this.show = function () { alert("I am FatherObj1"); }; this.getall = function () { if (arguments) alert("GetAll:" + arguments

js中 call 和 apply

call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thisObj[,argArray]]) 定义:应用某

js中call、apply和bind的区别

前言 关于js中call.apply和bind这三者的区别,这应该是一个老生常谈的问题,也是前端面试时经常会遇到的一道题目,因此也抽空把它理一遍. 作用 call.apply和bind都是一个javascript中的方法,他们的共同作用就是改变函数执行时的上下文,即改变函数执行时this的指向.我们来看下面的例子: 1 function Animal(name) { 2 this.name = name; 3 } 4 Animal.prototype.getName = function() {

js中call,apply,bind的实现原理()

/* author:yangJian */ // js中call,apply,bind的实现原理() // 三者的区别,都是改变this指针,call和apply主要是参数区别,bind返回的是一个函数体,而call和apply是立即执行 // call的实现 function fn1 (str1,str2,str3){ console.log(this,str1,str2,str3); } function fn2(){ } Function.prototype.call = function

js的call()和apply()方法的学习

1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thisObj[,argArray]])

js基础篇——call/apply、arguments、undefined/null

a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象.如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thisObj[,ar

JS的call与apply

在javascript中有两个方法call和apply, 这两个方法一般在js框架设计中用的比较多,比如jQuery Code. 那么,这两个方法是做什么的呢,ECMA的解释太抽象,直接看代码: 1 function f(){ 2 console.log(this.name); 3 } 4 5 var obj = {}; 6 obj.name = "obj"; 7 8 f.call(obj); //obj 我们分析一下f, f 中输出了this.name, 这里的this指的是函数在运

JS中call、apply的用法说明

JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组. 例如:function add(a, b) { return a + b; } function sub(a, b) { return a - b; } /*a