关于call 与 apply 那些事
1、定义:
call : 调用一个对象的一个方法,以另一个对象替换当前的对象。
apply : 应用某一对象的一个方法,用另一个对象替换当前的对象。
2、用法:
call:call(thisObj, arg1, arg2, ...); 说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj 。第二个参数开始,如 arg1...可以传递任意形式参数。
apply : apply(thisObj, [argArray]); 说明:thisObj 通常表示一个对象,如果没有提供 thisObj 参数,那么 Global 对象将作为 thisObj。 第二个参数开始,必须是array 或 arguments。
3、区别:
两者区别在于第二个参数。
4、个人理解 :
其实就是把前一对象的方法应用到后一对象上(括号中的第一个参数)。也就是改变了this指针的指向。
5、啥也不说,上几个简单代码 :
function func1(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
}
function func2(name){
this.name= name;
}
var obj1 = new func1("func1");
var obj2 = new func2("func2");
obj1.showName();
obj2.showName(); //直接报错,因为obj2里没有 showName() 方法
obj1.showName.call(obj2); //这样就可以把 obj1 中的 showName() 方法给 obj2 用
6、用来实现继承
function func1(name){
this.name = name;
this.showName = function(){
console.log(this.name);
}
}
function func2(name){
func1.call(this,name);
}
var obj2 = new func2("func2");
obj2.showName();
var Person = function(name,age){
this.name = name;
this.age = age;
this.gender = ['man','woman'];
}
var Stu = function(name,age,high){
Person.call(this,name,age);
this.high = high;
this.showMessage = function(){
console.log('name:'+this.name+", age:"+this.age+", high:"+this.high+", gender:"+this.gender[0]);
}
}
new Stu("zhangsan","20","178").showMessage();
function Person(name,age){
this.name = name;
this.age = age;
this.sayHello = function(){
console.log(this.name);
}
}
function Print(){
this.funcName = "Print";
this.show = function(){
var msg = [];
for(var key in this){
if(typeof(this[key])!="function"){
msg.push([key,":",this[key]].join(""));
}
}
console.log(msg.join(" "));
}
}
function Student(name,age,grade,school){
Person.apply(this,arguments);
Print.apply(this,arguments);
this.grade = grade;
this.school = school;
}
var p1 = new Person("liang",80);
p1.sayHello();
var s1 = new Student("kobe",20,9,"aaaa");
s1.show();
s1.sayHello();
console.log(s1.funcName);
7,实践
(1)找出数组中最大的元素,
var arr = [5,3,8,1,0];
Math.max(arr); // 这样是不行的, 会提示 NaN
所以需要遍历,如下:
function getMax(arr){
var arrlength = arr.length;
var ret = 0;
for(var i=0; i<arrlength; i++){
ret = Math.max(ret, arr[i]);
}
return ret;
}
console.log(getMax(arr));
换用apply, 可以这样写
function getMaxForApply(arr){
return Math.max.apply(null, arr);
}console.log(getMaxForApply(arr));
两段代码达到了同样的目的,但是 getMaxForApply 却很优雅、简洁得多。
(2)数组追加
var arr1 = [1,2,3];
var arr2 = [4,5,6];
把 arr2 追加到 arr1 中。
arr1.concat( arr2 ); // concat 方法并不改变 arr1 本身
正常需要如下操作:
function addarr(arr1,arr2){
var arrlen = arr2.length;
for(var i=0; i<arrlen; i++){
arr1.push(arr2[i]);
}
}
使用Apply ,代码就变得很简洁
function addarr(arr1,arr2){
Array.prototype.push.apply(arr1,arr2);
return arr1;
}
关于call 与 apply 那些事的更多相关文章
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply、bind那些事2
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- CSharpGL(31)[译]OpenGL渲染管道那些事
CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...
- call,apply,bind的用法
关于call,apply,bind这三个函数的用法,是学习javascript这门语言无法越过的知识点.下边我就来好好总结一下它们三者各自的用法,及常见的应用场景. 首先看call这个函数,可以理解成 ...
- js中bind,call,apply方法的应用
最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...
- JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- 关于javascript中apply()和call()方法的区别
如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语 ...
- 关于angularjS与jQuery框架的那些事
这篇文章主要介绍了jQuery和angularJS的区别浅析,本文着重讲解一个熟悉jQuery的程序员如何应对angularJS中的一些编程思想的转变吗,需要的朋友可以参考下 最近一直研究angula ...
- javascript篇-----函数apply()和call()
转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的 ...
随机推荐
- FBReader移植日记 第一天
1.目标是创建两个工程,一个j2se的桌面软件,用于编辑和预览epub等格式的电子书,预览的窗口可以设置分辨率来模拟不同的设备,把编辑的结果实时的显示出来.另一个是Android的应用,用于阅读,管理 ...
- poj 2505 A multiplication game(博弈)
A multiplication game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5622 Accepted: ...
- Java获取当前路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- Android WebRTC 音视频开发总结
www.cnblogs.com/lingyunhu/p/3621057.html 前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC. ...
- Boxes - SGU 126(找规律)
题目大意:有两个箱子,一个箱子装了A个球,一个箱子装了B个球,可以从球多的那个箱子拿出来球少的箱子里面球的总数放在少的那个箱子里面,问能否把球全部放在一个箱子里面? 分析:很容易求出来最后放的拿一下一 ...
- C# 程序集 与 反射
程序集 对于C#程序员来说一定不陌生,不就是VS生成的那些exe,dll么.是的,程序集(.net中exe与dll的区别就是exe有程序接入口,即Main函数)就是.net框架下,可以被CLR加载并运 ...
- JetBrains发布了一款免费的.NET反编译器dotPeek
Free .NET decompiler :: JetBrains dotPeek 主要的功能: Decompiling .NET 1.0-4.5 assemblies to C# Exporting ...
- 异常Address already in use: JVM_Bind的处理
如题,Address already in use: JVM_Bind这个异常的意思就是说jvm被占用了 那么大家一般的解决情况都是重启一下eclipse , 结果还是不行,结果就只能重启电脑了. 对 ...
- 银行B2C直连
银行B2C直连: 1. 银联B2C直连流程: 注: 所有银行B2C接入方式均为此流程. 不同银行只是签名及验签方式不一致,请求及返回参数不一样,其他的一致. 2. 银行B2C支付请求: 交易流程: ( ...
- Qt 学习之路:QML 组件
前面我们简单介绍了几种 QML 的基本元素.QML 可以由这些基本元素组合成一个复杂的元素,方便以后我们的重用.这种组合元素就被称为组件.组件就是一种可重用的元素.QML 提供了很多方法来创建组件.不 ...