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.语法和 ...
随机推荐
- [poj 3904] sky code 解题报告(组合计算+容斥原理)
题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...
- Car Talk1
This question is based on a Puzzler that was broadcast on the radioprogram Car Talk1: “I was driving ...
- 每位 Ubuntu 18.04 用户都应该知道的快捷键
作者: Abhishek Prakash 译者: LCTT XiatianSummer 了解快捷键能够提升您的生产力.这里有一些实用的 Ubuntu 快捷键助您像专业人士一样使用 Ubuntu. 您可 ...
- nginx设置可以默认访问index.php
vim /usr/local/nginx/conf/nginx.conf: 在 location /{ index index.php index.html i ...
- js利用点击事件做一个简单的计算器
先放一个样式图: 源代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- kolla-ansible 安装openstack 拉取阿里云镜像时报错
TASK [mariadb : Pulling mariadb image] ************************************************************ ...
- ATP自造8Gb内存颗粒供DDR3使用
随着整个行业已经全面转向DDR4内存,不少厂商都陆续停产了DDR3,并准备好了迎接DDR5,但对于很多特殊用户,尤其是网络和嵌入式领域,仍然对DDR3有着强劲且持续的需求. 工业内存存储厂商ATP E ...
- Configure Tomcat 7 to run Python CGI scripts in windows(Win7系统配置tomcat服务器,使用python进行cgi编程)
Pre-installation requirements1. Java2. Python steps1. Download latest version of Tomcat (Tomcat 7) f ...
- 用JS中的cookie实现商品的浏览记录
最近在做一个购物车效果,为了实现商品的浏览记录效果可是让我百般周折,避免以后忘记特写此随笔与大家共享,希望博友们看后有所收获. 第一步:在一个公用的js文件下getCookie(“liulan”),c ...
- UI_UISegmentedControl 控件
创建控件 - (void)createSegmentControl { UISegmentedControl *segmentedControl = [[UISegmentedControl allo ...