JS中this和call

首先来了解一下JS中this的原理:

要访问自己的属性就必须使用 this.属性名

1.this总是指向它的直接调用者:

1var a={ 2user:'Artimis', 3fn:function(){ 4 console.log(this.user) 5} 6} 7 8a.fn() //Artimis => this指向a 9 10var b=a.fn; 11b() //undefined => this指向window2. 如果没有找到直接调用者,this就指向window 12 13function fn(){ 14var user='Artimis'; 15console.log(this.user) 16} 17fn() //undefined => this指向window3.遇到return,如果返回的是对象,则this指向返回对象,否则指向函数function A(){ 18 19this.user='Artimis'; 20return {} //return一个空对象 21} 22 23var a=new A(); 24console.log(a.user) //undefined => this指向return的{} 25 26 27function B(){ 28this.user='Artimis'; 29return 1 //return一个数值 30} 31 32var b=new B(); 33console.log(b.user) //Artimis => this指向b还有最后一种,就是当使用call,apply,bind绑定的时候,this就指向绑定对象这里说一下call,apply以及bind的异同:call和apply:相同点都是临时借用一个函数,并替换this为制定对象,不同点在于传参方式不一样,并且都是立即执行;bind:基于现有函数,创建一个新函数,并且永久绑定this为其指定对象,可绑定参数,不过只是创建函数,不立刻执行。举个例子://定义一个add 方法 function add(x, y) { return x + y; } //用call 来调用 add 方法 function myAddCall(x, y) { //调用 add 方法 的 call 方法 return add.call(this, x, y); } //apply 来调用 add 方法 function myAddApply(x, y) { //调用 add 方法 的 applly 方法 return add.apply(this, [x, y]); } console.log(myAddCall(10, 20)); //输出结果30 console.log(myAddApply(20, 20)); //输出结果40从这里可以看出来call和appli都调用了add的方法,还可以通过this改变作用域:

var name = '小王';

var obj = {name:'小李'};

function sayName() {
return this.name;
}

console.log(sayName.call(this)); //输出小白

console.log(sayName. call(obj)); //输入小红

this还能实现继承

function Animal(name){

this.name = name;
this.age = 15;
}

function Cat(name){

Animal.call(this, name);
this.catName = 'cat';
}

let o1 = new Cat('test1');

console.log(o1);
//Cat {name: "test1", age: 15, catName: "cat"}

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0