JavaScript 从对象 new 说起,简单理解 this/call/apply
new
- 创建一个新对象;
- 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
- 执行构造函数中的代码(为这个新对象添加属性);
- 返回新对象
用代码描述的话(先别管proyotype, apply等):
1 function New (f) {
2 var n = { '__proto__': f.prototype }; /*第一步*/
3 return function () {
4 f.apply(n, arguments); /*第二步*/
5 return n; /*第三步*/
6 };
7 }
This
this 是一个指针,永远指向 父级中最近的一个 的 new 对象 实例
在页面加载时候,javascript 引擎完成 windows 实例化, 此时 this 指向 windows;
console.log(this === window); // true
var value = "i'm proproty of window instance";
console.log(value === window.value); // true
function show(){
console.log(this === window); // true
}
show();
只有当 new 一个新对象后,该对象内部的 this 才会全部指向 新的对象;
备注:var obj = {} 也是new
var show = {
do : function(){
console.log(this); // obj
console.log(this === window); // false
}
}
show.do();
特别注意以下情况:
var show = {
do : function(){
console.log(this); // window
console.log(this === window); // false
}
}
var doFun = show.do;
doFun();
show.do(): do 作为 show 对象的函数被调用。所以,上下文指的是show;
doFun(): show.do 被分配到 doFun变量时,因为 doFun 被隐式设置为全局对象的属性,因此,doFun 的 上下文指的是 window
Call & Apply
语法:
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
apply([thisObj[,argArray]])
Call和apply是改变函数的作用域(scope/上下文);
将构造函数的作用域赋给新对象(见 new 第二条,此时 this 就指向了这个新对象);
Call 和 apply是将 this 指向方法的第一个参数。
var value = "i'm proproty of window instance";
function show(){
console.log(this);
console.log(this.value);
} var obj = {
value : "i'm proproty of obj instance"
}; /*
* window
* i'm proproty of window instance
*/
show(); /*
* obj
* i'm proproty of obj instance
*/
show.call(obj);
JavaScript 从对象 new 说起,简单理解 this/call/apply的更多相关文章
- Javascript的堆和栈的简单理解
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- javascript 之对象-13
对象 无序属性的集合,属性可以包含基本值.对象或者函数,简单理解为对象是若干属性的集合:我们常说的面向对象(oop)编程其实是指的一种编码的思想,简单理解为用对象来封装数据,利用封装.继承.多态对代码 ...
- 关于javascript自定义对象(来自网络)(最近几天不会的)
javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...
- javaScript定义对象的方法
转自souhu新闻http://news.sohu.com/20110215/n279335637.shtml? javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放 ...
- javascript定义对象写法
javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...
- 自己理解的javascript 的对象和类理解
首先需要先理解类和对象的意义,我个人理解如下: 类:对象的抽象化: 对象:类的实体: javascript中没有class关键字和类的用法,只能用伪类来做类的,所以要用function来定义累的名字: ...
- js对象详解(JavaScript对象深度剖析,深度理解js对象)
js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了. JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕 ...
- 简单理解JavaScript原型链
简单理解原型链 什么是原型 ? 我是这样理解的:每一个JavaScript对象在创建的时候就会与之关联另外一个特殊的对象,这个对象就是我们常说的原型对象,每一个对象都会从原型"继承" ...
- 简单理解JavaScript闭包
很多关于JS的书籍例如<JavaScript权威指南>或者<高程>都把闭包解释的晦涩难懂,萌新们是怎么也看不懂啊!不过别怕,今天我就用很简单的方式给大家讲解下到底什么是闭包.这 ...
随机推荐
- 浅谈JavaScript变量声明提升
前段时间阿里实习生内推,一面就被刷了,也是郁闷.今天系统给发通知,大致意思就是内推环节不足以了解彼此,还可以参加笔试,于是赶紧再投一次.官网流程显示笔试时间3月31日,时间快到了,开始刷题.网上搜了一 ...
- PHP面试题及答案解析(5)—数据结构与算法
1.使对象可以像数组一样进行foreach循环,要求属性必须是私有.(Iterator模式的PHP5实现,写一类实现Iterator接口) <?php class Test implements ...
- python 读写数据
开源标准数据集 —— mnist(手写字符识别) 下载地址:mnist.pkl.gz 1. 使用 python 读取和解析 mnist.pkl.gz import pickle import gzip ...
- java之CGLIB动态代理
© 版权声明:本文为博主原创文章,转载请注明出处 CGLIB动态代理: CGLIB动态代理就是对指定的类生成一个子类,覆盖其中所有的方法并环绕增强 优势: - 1. 业务类只需要关注业务逻辑本身,保证 ...
- IIS7设置默认页
一般用ASP.NET创建的网站默认页都是Default.aspx,不需要设置. 但是如果有网站的起始页不是Default.aspx,就需要在IIS里设置了. IIS7的设置方法和IIS6的不一样: 在 ...
- apache占用内存高解决办法
我用512M的vps,访问量不大,但内存占用很大,甚至宕机. 我用top,然后shitf+m发现,httpd占用内存极大.经过网上找资料设置后,用过一段时间终于没再出现内存问题了. 首先查找配置文件的 ...
- ansible的异步执行
ansible任务的异步执行 96 茶客furu声 关注 2016.07.12 01:40* 字数 458 阅读 1777评论 0喜欢 4 ansible方便在于能批量下发,并返回结果和呈现.简单.高 ...
- 转:MSSQL SERVER行转列 列转行
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- 阿里巴巴产品实习生N天
时间貌似有些太遥远,已经没办法从刚来时的日子一天一天数.连上内网打开内外.看到45天,每一次不经意的邂逅总会让人认为奇妙而微妙,每一次的巧合总会让人认为是神在显灵(但愿天津安好,这里也曾在我心中滋润过 ...
- fiddler 清除证书+重新添加证书
1. 清除证书 ①任意浏览器,打开Internet属性弹窗,点击内容页签下<证书> ②删除个人页签下,颁发者为DO_NOT_TRUST_Fiddler**的数据 2. 重新认证证书 ①打开 ...