Js高阶:函数
一、函数内部的this指向
调用方式 | 内部指向 |
---|---|
普通函数调用 | 非严格模式下指向window, 严格模式下指向undefined |
构造函数调用 | 实例对象, 原型对象里面的方法也指向实例对象 |
对象方法调用 | 该方法所属对象 |
事件函数调用 | 触发事件的事件源 |
定时器函数调用 | window |
自执行函数调用 | window |
二、改变this指向的方法
2.1 三种方法可以改变this指向
- call()
- apply()
- bind()
2.2三种方法的相同点和不同点
共同点: 都可以改变this指向
不同点:
- call和apply会立即调用函数,bind需要手动调用
- call和apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
应用场景
- call 经常做继承
- apply 经常跟数组有关系, 比如借助于数学对象实现数组最大值最小值
- bind 不调用函数,但是想改变this指向,比如改变定时器内部的this指向.
三、判断数据类型的四种方法
3.1 typeOf
typeof可以对基本数据类型进行判断
注意: null返回的是object 还可以返回function
3.2 instanceOf
用来检测复杂数据类型
var date = new Date();
console.log(date indstanceOf Date);
返回值为true/false
注意: 任何复杂数据类型和object匹配都为true
3.3 检测当前实例的构造函数
通过constructor指向的构造函数进行判断当前数据类型
3.4 Object.prototype.toString()判断数据类型(最为准确);
通过此方法确定数据类型是最为准确的判断方式
var toString = Object.prototype.toString;
toString.call(123); //"[object Number]"
toString.call('abcdef'); //"[object String]"
toString.call(true); //"[object Boolean]"
toString.call([1, 2, 3, 4]); //"[object Array]"
toString.call({name:'wenzi', age:25}); //"[object Object]"
toString.call(function(){ console.log('this is function'); });
//"[object Function]"
toString.call(undefined); //"[object Undefined]"
toString.call(null); //"[object Null]"
toString.call(new Date()); //"[object Date]"
toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]"
toString.call(new Error()); //"[object Error]"
四、JS继承的实现方式
4.1 第一种方式,直接继承
4.1.1 构造函数继承
function Father(name){
this.name = name;
}
function Son(name,age){
Father().call(this,name);
this.age = age;
}
var son = new Son("张美丽",18);
console.log(son.name);
//通过call改变Father的this指向,从而实现让Son的实例化对象继承Father构造函数的属性
4.1.2 原型对象继承
构造函数继承后虽然继承到了属性,但是原型对象中的方法缺没有继承,还需要对原型对象进行继承
function Father(name){
this.name = name;
}
Father.prototype.sayHi = function(){
console.log("你好呀");
}
function Son(name,age){
Father().call(this,name);
this.age = age;
}
Son.prototype = new Father();
//通过复值方式会连constructor一起进行改变,需要将constructor的值改回来
Son.prototype.constructor = Son;
var son = new Son("张美丽",18);
4.2 通过Object.create类实现继承
function Father(name){
this.name = name;
}
Father.prototype.sayHi = function(){
console.log("你好啊");
}
function Son(name,age){
Father().call(this,name);
this.age = age;
}
Son.prototype = Object.create(Father.prototype,{
construtor:{
value:Son
}
});
var son = new Son("张美丽",18);
son.sayHi();