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.语法和 ...
随机推荐
- List methods
Python provides methods that operate on lists. For example, append adds a new element to the end of ...
- 安卓开发--HttpClient
package com.zx.httpclient01; import android.app.Activity; import android.os.Bundle; import android.v ...
- js变量作用域和闭包的示例
<script> /* js是函数级作用域,在函数内部的变量,内部都能访问, 外部不能访问内部的,但是内部可以访问外部的变量 闭包就是拿到本不该属于他的东西,闭包会造成内存泄漏,你不知道什 ...
- 为Activity生成桌面快捷方式
有时候如果想让我们的应用在桌面上创建多个快捷方式,我们可以在Manifest.xml文件中对相应的activity进行声明. <application android:icon="@d ...
- Linux VNC Viewer客户端
1.realvnc-vnc-viewer 这个我感觉应该是做的做好用的VNC Viewer客户端了,毕竟是商业软件,但是VNC Viewer客户端是免费的.使用前 需要到官网下载对应发行版的软件包进行 ...
- input的选中与否以及将input的value追加到一个数组里
html布局 <div class="mask"> //每一个弹层都有一个隐藏的input <label> <input hidden="& ...
- CF19E Fairy(树上差分)
题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...
- 前端之HTTP协议
HTTP协议简介 作为学习前端开发的开始,我们必须搞明白以下几件事 1.什么是互联网 互联网=物理连接介质+互联网协议 2.互联网建立的目的? 数据传输打破地域限制,否则的话,我想获 ...
- Android 查看CPU及内存
借助getprop.dumpsys来了解一些系统相关信息. 一.getprop adb shell cat /system/build.prop 文件中存放的是用于启动系统时需要的配置文件,通常可以通 ...
- Ehcache学习总结(3)--Ehcache 整合Spring 使用页面、对象缓存
Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式 ...