js的call和apply

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>call和apply</title>
	<script>
		//定义一个对象,包含属性和方法
		var stu={
			name:'tom',
			age:21,
			study:function(){
				console.log('我叫'+this.name+',正在学习....');
			}
		}
		// stu.study();

		//定义一个函数
		function show(){
			console.log('welcome to itany');
		}
		// show();

		/**
		 * 如果stu也想调用show()函数,怎么办?
		 */
		//方式1:为stu添加show方法,永久拥有
		// stu.show=show; //将show属性指向show()函数
		// stu.show();
		//方式2:只想临时调用
		// window.show();
		// show.call(stu);
		// show.apply(stu); //stu对象临时调用show()函数

		//this的转变
		function show2(){
			console.log(this);
		}
		// show2(); //直接调用,this表示window
		// show2.call(stu); //对象临时调用,this表示调用的对象,即stu
		// show2.apply(stu);


		/**
		 * call和apply
		 * 作用:调用一个对象的方法,但是是以另一个对象来调用
		 * 区别:功能完全相同,只是传参方式有所不同
		 * 		1.第一个参数相同,都是指向某个对象,由该对象来调用方法
		 * 		2.后面的参数不同
		 * 			call是逐个传参,后面参数可以有多个,逗号隔开
		 * 			apply是以数组形式传参,后面参数只能有一个
		 */
		 function add(num1,num2){
		 	console.log(num1+num2);
		 }
		 // add.call(stu,3,8);
		 // add.apply(stu,[3,8]);
  		

  		/**
  		 * 应用场景
  		 */
  		//实例1
  		var obj={
  			name:'tom',
  			age:22
  		}
  		/*var arr=new Array();
  		arr[0]=12;
  		arr[1]='alice';
  		arr['sex']='male';*/
  		// console.log(typeof Array);	//function
  		// console.log(Array.prototype); //js中函数也是对象,函数名是对Function对象的引用
  		/*obj.sex='male';
  		Array.prototype.push.call(obj,'aaa');
  		Array.prototype.push.call(obj,'bbb');
  		console.log(obj);*/

  		//实例2:用来判断对象的类型
  		var data=12;
  		// var data=[12,4,34];
  		// var data;
  		// var data=null;
  		// var data=true;
  		// console.log(typeof data);
  		// console.log(data.constructor.name);
  		// console.log(Object.prototype); //toString()方法是定义在Object.prototype中的,用来判断值的类型
  		var str=Object.prototype.toString.call(data);
  		// console.log(str); //[object 类型]
  		if(Object.prototype.toString.call(data)==='[object Array]'){
  			console.log('这是一个数组');	
  		}
  		//注意:要与普通对象的toString()方法区分开,作用:将一个值转换为字符串形式
  		// console.log(data.toString());

  		//实例3:继承,通过call之后,extend可以继承到base的属性和方法
  		function parent(){
  			this.name='tom',
  			this.age=25;
  			this.play=function(){
  				console.log(this.name+',正在玩。。。。');
  			}
  		}
  		function child(){
  			parent.call(this);
  			this.sex='female',
  			this.show=function(){
  				console.log(this.name+','+this.age+','+this.sex);
  			}
  		}
  		var c=new child();
  		c.play();
  		c.show();
	</script>
</head>
<body>
	
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值