JavaScript 从对象 new 说起,简单理解 this/call/apply

new 

  1. 创建一个新对象;
  2. 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
  3. 执行构造函数中的代码(为这个新对象添加属性);
  4. 返回新对象

  用代码描述的话(先别管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;

1 console.log(this === window);      // true
2 var value = "i‘m proproty of window instance";
3 console.log(value === window.value);  // true
4 function show(){
5   console.log(this === window);    // true
6 }
7 show();

  只有当 new 一个新对象后,该对象内部的 this 才会全部指向 新的对象;

   备注:var obj = {} 也是new

  

1 var show = {
2     do : function(){
3         console.log(this);         // obj
4         console.log(this === window);  // false
5     }  
6 }
7 show.do();

  特别注意以下情况:

1 var show = {
2     do : function(){
3         console.log(this);                // window
4         console.log(this === window);    // false
5     }  
6 }
7
8 var doFun = show.do;
9 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 指向方法的第一个参数。

 1 var value = "i‘m proproty of window instance";
 2 function show(){
 3     console.log(this);
 4     console.log(this.value);
 5 }
 6
 7 var obj = {
 8       value : "i‘m proproty of obj instance"
 9 };
10
11 /*
12  * window
13  * i‘m proproty of window instance
14  */
15 show();
16
17 /*
18  * obj
19  * i‘m proproty of obj instance
20  */
21 show.call(obj);
时间: 2024-11-10 14:40:35

JavaScript 从对象 new 说起,简单理解 this/call/apply的相关文章

对象序列化原因的简单理解

序列化和反序列化我们可能经常会听到,其实通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,其最终目的都是将内存中的对象持久化或者是在网络上传输.反序列化就是在适当的时候把这个文件再转化成原来的对象使用. 使用序列化的原因 a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本.我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据.尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂.可

关于javascript自定义对象(来自网络)(最近几天不会的)

javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 function User1(name, password) { this.name = name; this.password = password; this.login = function(name,password){ if(this.name == name && this.password

javaScript定义对象的方法

转自souhu新闻http://news.sohu.com/20110215/n279335637.shtml? javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 function User1(name, password) { this.name = name; this.password = password; this.login = function

javascript定义对象写法

javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存[花花评:主要指方法,引用对象适合用此方法初始化,值对象其实无所谓] function User1(name, password) {this.name = name;this.password = password;this.login = function(name,password){if(this.na

自己理解的javascript 的对象和类理解

首先需要先理解类和对象的意义,我个人理解如下: 类:对象的抽象化: 对象:类的实体: javascript中没有class关键字和类的用法,只能用伪类来做类的,所以要用function来定义累的名字: 如: function myClass(){ this.name="张三"; } 这样myClass方法才能用原型连接 prototype:这样才能扩展此类: 也可以用 new myClass();这个类 javascript中有对象,简单的写法就是 var obj={name:&quo

Javascript闭包简单理解

提到闭包,想必大家都早有耳闻,下面说下我的简单理解.说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和组件或多或少用到了闭包.所以,了解闭包是非常必要的.呵呵... 一.什么是闭包简而言之,就是能够读取其他函数内部变量的函数.由于JS变量作用域的特性,外部不能访问内部变量,内部可以外部变量. 二.使用场景1. 实现私有成员.2. 保护命名空间,避免污染全局变量.3. 缓存变量. 先看一个封装的例子: var person = function () { // 变量作用域为函

JavaScript中this指向的简单理解

首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题. 为什么要学习this?如果你学过函数式编程,面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不

Javascript之对象组合继承

感悟: 最近看了一些关于Javascript对象继承的知识,发现自己之前虽然看了一些书,但是很多知识都忘了.虽然很多东西都忘了,但再次看的过程中对这些东西不会再向刚接触时那么陌生,而且理解起来也比之前顺畅和透彻多了. 充分说明:多看书是有意义的. ————————————————————————————————————————————————————————————————————————————————————————————碎碎念 关于对象之间的继承,在Javascript中主要是通过原型对

对闭包的简单理解

javascript理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部