Js高阶:函数

一、函数内部的this指向

调用方式内部指向
普通函数调用非严格模式下指向window, 严格模式下指向undefined
构造函数调用实例对象, 原型对象里面的方法也指向实例对象
对象方法调用该方法所属对象
事件函数调用触发事件的事件源
定时器函数调用window
自执行函数调用window

二、改变this指向的方法

2.1 三种方法可以改变this指向

  1. call()
  2. apply()
  3. bind()

2.2三种方法的相同点和不同点

共同点: 都可以改变this指向
不同点:

  1. call和apply会立即调用函数,bind需要手动调用
  2. call和apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递

应用场景

  1. call 经常做继承
  2. apply 经常跟数组有关系, 比如借助于数学对象实现数组最大值最小值
  3. 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值