在js中this的使用方法非常让人迷惑。有些像Java或者C#中的this,但又不全然一样。依照流行的说法this总是指向调用方法的对象。

1、纯粹函数调用。

 function ListCommon2(x)
{
this.x=x;
alert("this 是 ListCommon2"+(this instanceof ListCommon2));
alert("this.constructor"+this.constructor);
}
function test(){
//測试代码
var t1=ListCommon2("烧水");
var t2=new ListCommon2("烧水2");
}

经过測试发现,

假设不使用new,也就是var t1=ListCommon2("烧水");这样调用,this是全局对象Window对象,

假设使用new,也就是var
t2=new ListCommon2("烧水2");;这样调用,this就变成了new出来的实例对象的应用,也就是 t2,

看来和调用方式也是有关系的。

2、作为方法调用,那么this就是指实例化的对象。

 function ListCommon2(x)
{
this.x=x;
this.Do=function(x)//特权方法 实例方法
{
alert("this 是 ListCommon2"+(this instanceof ListCommon2));
alert("this.constructor"+this.constructor);
}
}
ListCommon2.prototype.Do2=function()//实例方法
{ alert("this 是 ListCommon2"+(this instanceof ListCommon2));
alert("this.constructor"+this.constructor);
} function test(){
//測试代码
var t1=ListCommon2("烧水");
// t1.Do();调用错误
// t1.Do2();调用错误
var t2=new ListCommon2("烧水2");
t2.Do();
t2.Do2();
}

经过測试发现。无论是特权方法类型的实例方法,还是原型类型的实例方法,this都指向了当前新创建的对象。

3 apply,call调用

apply的第一个參数就是this。假设没有传递this就是全局对象。

改变this的方法。通过new能够改变,使用call和apply也能够改变

4 setTimeout中的this

 function ListCommon2(x)
{
this.x=x;
this.Do=function(x)//特权方法 实例方法
{
window.setTimeout(function(){
alert("this 是 ListCommon2"+(this instanceof ListCommon2));
alert("this.constructor"+this.constructor); },100);
}
}
ListCommon2.prototype.Do2=function()//实例方法
{
window.setTimeout(function(){
alert("this 是 ListCommon2"+(this instanceof ListCommon2));
alert("this.constructor"+this.constructor); },100);
} function test(){
//測试代码
var t2=new ListCommon2("烧水2");
t2.Do();
t2.Do2();
}

測试发现setTimeout中的this也是全局对象Window对象。当然这种样例还有非常多,感觉应该是实例化的对象,可实际上却不是。因此须要注意。

參考文章

js中this的使用方法

js中this的总结

js面向对象编程:this究竟代表什么?的更多相关文章

  1. 页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作

    页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...

  2. js面向对象编程 ---- 系列教程

    原 js面向对象编程:数据的缓存 原 js面向对象编程:如何检测对象类型 原 js面向对象编程:if中可以使用那些作为判断条件呢? 原 js面向对象编程:this到底代表什么?第二篇 原 js面向对象 ...

  3. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  4. Js面向对象编程

    Js面向对象编程 1.     什么是面向对象编程? 我也不说不清楚什么是面向对象,反正就那么回事吧. 编程有时候是一件很快乐的事,写一些小游戏,用编程的方式玩游戏等等 2.     Js如何定义一个 ...

  5. js原生设计模式——3简单工厂模式\js面向对象编程实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. JS面向对象编程(进阶理解)

    JS 面向对象编程 如何创建JS对象 JSON语法声明对象(直接量声明对象) var obj = {}; 使用 Object 创建对象 var obj = new Object(); JS对象可以后期 ...

  7. 简单粗暴地理解js原型链–js面向对象编程

    简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...

  8. JS面向对象编程,对象,属性,方法。

    document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...

  9. js面向对象编程(第2版)——js继承多种方式

    附带书籍地址: js面向对象编程(第2版)

  10. 原生js面向对象编程-选项卡(自动轮播)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

随机推荐

  1. EasyUI-datagrid-自动合并单元格

    1.目标 1.1表格初始化完成后,已经自动合并好需要合并的行: 1.2当点击字段排序后,重新进行合并: 2.实现 2.1 引入插件 /** * author ____′↘夏悸 * create dat ...

  2. HDU 4585 Shaolin (STL)

    没想到map还有排序功能,默认按照键值从小到大排序 #include <cstdio> #include <iostream> #include <cstring> ...

  3. Run Repository Creation Utility (RCU) for Oracle Identity Management components

    Run Repository Creation Utility (RCU) for Oracle Identity Management components         Installing O ...

  4. 把普通java项目转换成maven项目

    我使用的是eclipse,右键项目,Configure->Convert to Maven Project 然后就是jar包的引入了,如果jar包比较简单,建议从maven中拉取,这样便于后期升 ...

  5. 利用Session完成用户的登录和注销

    用户的登录和注销是最常见的Web应用案例,当一个应用的客户登录了以后,其他所有的会话都得知道这个用户已经登录还很有可能得提取用户的昵称予以显示等等,所以,只有把登录成功的用户的信息放入到Session ...

  6. java.io.IOException: Input/output error

    java.io.FileOutputStream.close0(Native Method)at java.io.FileOutputStream.close(FileOutputStream.jav ...

  7. 算法笔记_197:历届试题 带分数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. ...

  8. svn log笔记

    背景: svn,版本 1.7.8 以下所有命令直接和svn服务器进行交互并没有checkout代码到本地 1.查询分支从拉出来到现在的变更: svn log branche_url --stop-on ...

  9. Codevs3008 加工生产调度

    题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,而且必须先在A车间加工后才干够到B车间加工. 求如何安排这n个产品的加工顺序.才干使总的加工时间最短. 这里所说的加工时间是指 ...

  10. 【Oracle】RAC 10.2.0.1升级10.2.0.5

    环境: OS:OEL5.6 RAC:10.2.0.1.0 相关环境变量: CRS_HOME /u01/app/oracle/product/10.2.0/db_1 ORACLE_HOME   /u01 ...