js---13 this call apply
//this:this可以写在js全剧环境中(全局环境中this是window对象),this可以写在函数中,可以写在对象中,
function f(){
this.name = "asdfas";
}
var o ={
name :"cj",
print:function(){
console.log(this.name);
}
};
o.print();//cj
var f = o.print();//java的内存分析模型来分析js内存模型。函数也有地址,f就指向print指向的函数对象,
f();//undefined,
/*this是运行时决定不是代码写的时候决定,this写在函数中,哪个对象调用函数, ,this就指向那个对象, f() === window.f(),所以未定义。
*/ var ele = document.getElementById("id");
ele.addEventListener("click",function(){
console.log(this);//this永远指向dom元素,就是引发事件的对象,
}) //call,apply都是函数对象有的,动态改变函数调用的对象
function log(a){
console.log(this[a]);
}
log("name"); //this是window对象,global
log.call(o,"name");//cj,相当于o.log("name"),不让window调用log函数让o来调用log函数,call方法第一个参数是要调用这个函数的对象,第二个是参数。 function log(a,b){
console.log(this[a]);//通过中括号访问函数对象的成员属性,
console.log(this[b]);
}
log("name","");
log.apply(o,"name","age");
log.apply(o,["name","age"]); //apply接受参数是数组,call是一个一个传递 log.call(this,) == this.log() function p(){
this.name = "111";//函数的this是调用这个函数的对象
}
var d = p();//单纯函数执行不会返回对象,除非函数里面返回了函数就是返回子类对象,
console.log(d.name);//name未定义
var o ={};
p.call(o);//相当于o.p(), this就指向o,然后增加一个属性name
console.log(o.name); // function Person(name,age){
this.name = name;
this.age = age;
}
var p1 = new Person ("cj",22);//new出来的,当然p1就是这个函数类的实例化对象
console.log(p1 instanceof Person); //true //自定义new
function New(f){ //f 是个函数。f 构造器函数
var o = {"__proto__":f.prototype}; //o.__proto__ 指向函数f的prototype
return function(){//返回函数,可以不写形参,按照java父类子类思维,每次return的函数地址是不一样的,就像return多个子类对象,
//o.name = arguments[0];
//o.age = arguments[1];
f.apply(o,arguments);//o调用f,f函数里面的this就是o了,o就有了f函数的成员属性和值 return o;//函数执行时返回o对象
}
}
var p2 = New(Person)("xx",33);//New(Person)返回函数,("xx",33)函数执行返回o
console.log(p2.name);//xx
console.log(p2 instanceof Person);//true </script>
// java的面向对象思维来分析js函数闭包而已,函数成员属性的作用范围也用java父子类思维来分析
//函数的嵌套,产生的闭包的作用范围,类似于父类子类对象堆的作用域范围。return函数出去,每次return都是一个新的函数地址(产生新的闭包)
function New(f){ //类1
var o = {"__proto__":f.prototype}; //对象2,对象的组合
return function(){ //类3
f.apply(o,arguments);
return o;//函数执行时返回o对象
}
}
var temp = New(Person); //window.New(Person),函数1执行,return function()返回函数3地址就是对象3
var p2 = temp("11",11); //window.temp("11",11),函数3执行, ,返回对象2,
var p3 = temp("22",22);// 函数3执行,返回对象2, p2,p3是同一个对象o
console.log(p2.name); //
console.log(p3.name); // function New(f){//对象1
return function(){//对象3
var o = {"__proto__":f.prototype};//对象2,对象的组合
f.apply(o,arguments);
return o;
}
}
var temp = New(Person);//返回对象3
var p2 = temp("11",11); //函数3执行,返回对象2,这个对象
var p3 = temp("22",22);
console.log(p2.name); //
console.log(p3.name); //
js---13 this call apply的更多相关文章
- js继承之call,apply和prototype随谈
在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...
- index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined
使用 webpack 编译 Vue 项目时出现报错: index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined ...
- js中call和apply的实现原理
js中call和apply的实现原理 实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...
- 使用JS简单实现一下apply、call和bind方法
使用JS简单实现一下apply.call和bind方法 1.方法介绍 apply.call和bind都是系统提供给我们的内置方法,每个函数都可以使用这三种方法,是因为apply.call和bind都实 ...
- (转)js的call和apply
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- js中call、apply、bind那些事2
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如… 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- js基础篇——call/apply、arguments、undefined/null
a.call和apply方法详解 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 ...
- 区别和详解:js中call()和apply()的用法
1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...
随机推荐
- [CQOI2009] 叶子的颜色 解题报告(树形DP)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1304 Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为 ...
- 安装Git和图形化软件[SouceTree跳过首次登陆]
安装Git和图形化软件[SouceTree跳过首次登陆] 标签(空格分隔): 版本控制 安装GIT[客户端]: 下载:[https://git-scm.com/downloads/] 安装:[next ...
- C语言基础-第五章
流程控制 1.顺序结构 顺序结构是指程序将按照书写的顺序一步步执行程序. 2.选择结构 2.1但分支结构语句 if(表达式){语句} 2.2双分支结构 if(表达式){}else if{} else{ ...
- rails 开发随手记 7
jQuery 1.9 中如何修改选择项 $("select option:contains(teacher5)").prop('selected', 'selected'); 效果 ...
- T_SQL 字符串函数
字符串函数用于处理列中的数据值,通常属于字符型的数据类型. 1.ASCLL(character),将具体字符转换为相应的整数(ASCII)代码,结果为正数. 例:select ASCII('A'), ...
- GoldenGate 进程
GoldenGate进程 Manager进程 Manager进程是GoldenGate的控制进程,运行在源端和目标端上.它主要作用有以下几个方面:启动.监控.重启Goldengate的其他进程,报告错 ...
- Nginx的日志备份操作
正常情况下,我们给一个日志文件做备份.通常会 mv access.log access.log.0313 ,之后创建一个新的 touch access.log 会认为是备份完成了:旧的日志 ...
- CF 986C AND Graph(建模+DFS)
#include<stdio.h> ],v[]; ],n,al; void dfs(int x){ if(v[x])return; v[x]=; if(ex[x])dfs(al^x); ; ...
- Java基础学习总结(11)——重载与重写
首先我们来讲讲:重载(Overloading) 一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样 ...
- Network authentication method and device for implementing the same
A network authentication method is to be implemented using a network authentication device and a use ...