摘自 http://www.cnblogs.com/qzsonline/archive/2013/03/05/2944367.html
一、方法的定义
call方法:
语法:call(thisObj,Object)
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
语法:apply(thisObj,[argArray])
apply传入的是数组,call方法后面传入的是数组中的对象
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
function Animal(name) { this.name = name; this.showName = function() { console.log(this.name); }; } function Cat(name) { Animal.call(this, name); } Cat.prototype = new Animal(); function Dog(name) { Animal.apply(this, name); } Dog.prototype = new Animal(); var cat = new Cat("Black Cat"); //call必须是object var dog = new Dog(["Black Dog"]); //apply必须是array cat.showName(); dog.showName(); console.log(cat instanceof Animal); console.log(dog instanceof Animal);
模拟call apply 的this替换
function Animal(name) { this.name = name; this.showName = function() { alert(this.name); }; }; function Cat(name) { this.superClass = Animal; this.superClass(name); delete superClass; } var cat = new Cat("Black Cat"); cat.showName();
var arr1 = new Array(); for(var i=0;i<3;i++){ arr1[i] =i } console.log(arr1) var arr2 = new Array(); for(var m=0;m<3;m++){ arr2[m]=m } /*call()和apply()方法*/ arr1.push.apply(arr1,arr2); console.log(arr1);//[0, 1, 2, 0, 1, 2] arr1.push.call(arr1,arr2); console.log(arr1);// [0, 1, 2, 0, 1, 2, {0,1,2}] // console.log(ccc); arr11 = Array.prototype.push.apply(arr1,arr2); console.log(arr11);//输出数组总数
typeof和instanceof的区别
摘自 http://blog.csdn.net/u014421556/article/details/52083215
typeof来判断变量的基本类型
但是这个方法不适用于来判断数组,因为不管是数组还是对象,都会返回object,这就需要我们需求其他的方法。
有几种方法可以拿来判断:
1、constructor属性
这个属性在我们使用js系统或者自己创建的对象的时候,会默认的加上,例如:
var arr = [1,2,3]; //创建一个数组对象
arr.prototype.constructor = Array; //这一句是系统默认加上的
所以我们就可以这样来判断:
var arr = [1,2,3,1];
alert(arr.constructor === Array); // true
2、instanceof
instanceof是检测对象的原型链是否指向构造函数的prototype对象的,所以我们也可以用它来判断:
var arr = [1,2,3];
alert(arr instanceof Array); // true
判断数组最终方案
var arr = [1,2,3]; function isArrayFn(obj){ //封装一个函数 if (typeof Array.isArray === "function") { return Array.isArray(obj); //浏览器支持则使用isArray()方法 }else{ //否则使用toString方法 return Object.prototype.toString.call(obj) === "[object Array]"; } } alert(isArrayFn(arr));// true