关于call 与 apply 那些事
2016-04-19 10:58
447 查看
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、啥也不说,上几个简单代码 :
6、用来实现继承
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 : 应用某一对象的一个方法,用另一个对象替换当前的对象。
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;
}
相关文章推荐
- Android studio code template个性化设置
- Unity中注意事项 其实很简单,应该是自己粗心吧- -
- Jenkins 中运行Android lint和monkey
- Android WebView 因重定向无法正常goBack()解决方案
- iOS 基于 MVC 的项目重构总结
- NSObject:类与协议(NSObject: the Class and the Protocol)
- Android 可拖动的seekbar自定义进度值
- Android 静默安装/后台安装
- Android截取视频帧并转化为Bitmap示例
- android5.1+获取当前运行的app
- js 手机端触发事事件、javascript手机端/移动端触发事件
- Android 图片处理(一)
- Swift UIDatePikcer
- 人脸矫正之人眼检测实例(Android)
- Android 中个别机型运行完崩溃出现UnsatisfiedLinkError 错误的原因及解决方案
- 高效加载大图
- iOS7以后电池状态栏颜色设置
- 转:Spring mvc中@RequestMapping 6个基本用法小结
- android-修改TextView中部分文字的颜色
- 打包并发布自己的Android APP