`
jaesonchen
  • 浏览: 315150 次
  • 来自: ...
社区版块
存档分类
最新评论

javascript this对象

 
阅读更多
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>this.html</title>
	
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
    <script type="text/javascript" src="../js/jquery-1.11.3.js"></script>

  </head>
  
  <body>
	<div id="div"></div>
	<script type="text/javascript">
	// <![CDATA[
		//如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:
		var global = (function () {
			return this;
		})();
		
		function show(str) {
			$("#div").append($("<p></p>").text("" + str));
		}

		//JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 
		//在五种不同的情况下 ,this的指向各不相同。 
		//1、全局范围内:当在全局范围内使用 this,它将会指向全局对象global
		//浏览器中运行的 JavaScript 脚本,这个全局对象的属性是global.window = global
		show(global);	//[object Window]
		
		//2、直接调用函数:这里 this 会指向全局对象。 
		//ES5 注意: 在严格模式下(strict mode),不存在全局变量。 这种情况下 this 将会是 undefined。 
		//function声明时相当于为全局添加了一个类型为Function的属性global.funName = function() {}
		function Test(name) {
			this.name = name;
			this.getName = function() {
				return this.name;
			};
		}
		//这里相当于调用global.Test("jaeson"),this指向global,为global增加了两个成员变量。
		Test("jaeson");
		show(global.name);	//jaeson
		show(getName());	//jaeson
		
		//3、点号方法调用:指向调用函数的对象。
		//相当于声明了global.test1 = {name : "coolrice", getName : function() { return this.name; }}
		var test1 = new Test("coolrice");
		//这里this指向test1对象
		show(test1.getName());	//coolrice
		
		//4、调用构造函数:如果函数倾向于和 new 关键词一块使用,则我们称这个函数是构造函数。 在函数内部,this指向新创建的对象。
		//5、显式的设置 this:当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被显式设置为函数调用的第一个参数。 
		function foo() {
			this.name = "foo";
			this.show = function() {
				show("foo.show=" + this.name);
			};
		}
		function bar() {
			this.name = "bar";
			this.show = function() {
				show("bar.show=" + this.name);
			};
		}
		
		var foo1 = new foo();
		var bar1 = new bar();
		//this指向foo1
		foo1.show();			//foo.show=foo
		//this指向foo1
		bar1.show.call(foo1);	//bar.show=foo
		
		//注意: 在对象的字面声明语法中,this 不能用来指向对象本身。 因此 var obj = {me: this} 中的 me 不会指向 obj,
		//因为 this 只可能出现在上述的五种情况中。这个例子中,如果是在浏览器中运行,obj.me 等于 global 对象。 
		var obj = {me: this};
		show(obj.me);	//[object Window]
		
		
		//常见误解:
		//尽管大部分的情况都说的过去,不过第二个规则(就是直接调用函数时,this 指向全局对象global)
		//被认为是JavaScript语言另一个错误设计的地方,因为它从来就没有实际的用途。 
		function TestMethod(name) {
			function method(name) {
				// this 将会被设置为全局对象(浏览器环境中也就是 window 对象)
				this.username = name;
			}
			method(name);				
		}
		TestMethod.prototype.username="value from prototype";
		TestMethod("chenzq");
		show(global.username);		//chenzq
		
		var testm = new TestMethod("jaesonchen");
		//从原型链中获得值
		show(testm.username ? testm.username : "undefined");	//value from prototype
		show(global.username);		//jaesonchen
		
		//一个常见的误解是 method 中的 this 将会指向 TestMethod 对象,实际上不是这样子的。 
		//为了在 method 中获取对 TestMethod 对象的引用,我们需要在 method 函数内部创建一个局部变量that指向 TestMethod 对象。 
		//that这个名字被广泛的用来指向外部的 this 对象。 在 闭包 中,经常可以看到 that 可以作为参数传递。
		function TestThat(name) {
			var that = this;
		  	function method(name) {
		    	// 使用 that 来指向 TestThat的对象
		    	that.namethat = name;
		  	}
		  	method(name);				
		}
		TestThat("name that");
		show(global.namethat);	//name that
		
		//这里this指向testt对象
		var testt = new TestThat("new that");
		show(testt.namethat);	//new that	
		show(global.namethat);	//name that
		
		//另一个看起来奇怪的地方是函数别名,也就是将一个方法赋值给一个变量。 
		function TestAlias(name) {
			this.aliasName = name;
			this.getAliasName = function() {
				return this.aliasName;
			};
		}
		var testa = new TestAlias("alias");
		show(testa.getAliasName());			//alias
		//相当于global.func = function() { return this.aliasName; }
		//func 就像一个普通的函数被调用;因此,函数内的 this 将不再被指向到 testa 对象,而是global对象。
		var func = testa.getAliasName;
		show(func());	//undefined
		
		//对于函数作为参数传递导致的this指针丢失的问题,目前很多框架都已经有方法解决了。
		//Prototype的解决方案——传参之前使用bind方法将函数封装起来,并返回封装后的对象
		function bind() {
    		if (arguments.length < 2 && arguments[0] === undefined) 
        		return this;
    		var __method = this, args = $A(arguments), object = args.shift();
   			return function(){
        		return __method.apply(object, args.concat($A(arguments)));
    		};
		}
		
	// ]]>
	</script>
  </body>
</html>

 

分享到:
评论

相关推荐

    Javascript面向对象编程.

    面向对象编程(Object-Oriented Programming,OOP)是编程的一种重要范式,JavaScript也完全支持这一特性,尽管它并非一种传统的静态类型语言。这篇博客文章可能详细讨论了如何在JavaScript中实现面向对象编程。 在...

    JavaScript核心对象参考手册

    11. **箭头函数Arrow Functions**: 箭头函数提供了一种更简洁的函数定义方式,其`this`值继承自父作用域,不绑定自己的`arguments`对象。 12. **Map 和 Set**: 这两种数据结构提供了更高效、灵活的键值对存储。Map...

    JAVASCRIPT 面向对象编程精要

    ### JavaScript面向对象编程精要 #### 一、引言 JavaScript是一种灵活且强大的脚本语言,它虽然起源于一种简单的浏览器脚本语言,但随着时间的发展,JavaScript已经成为了一种功能全面的编程语言,尤其是在Web开发...

    Javascript 面向对象的JavaScript进阶

    ### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...

    Javascript面向对象编程

    ### JavaScript面向对象编程详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发领域占据着举足轻重的地位。尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得...

    javascript创建对象的方式(二)

    在JavaScript中,创建对象是编程的基本操作之一,它支持多种方式来实现这一目的。这篇博客“javascript创建对象的方式(二)”可能详细介绍了在JavaScript中除了最基础的字面量语法之外的其他创建对象的方法。这里...

    JavaScript面向对象编程指南.pdf

    6. this关键字:在JavaScript中,this关键字用来引用当前执行上下文的对象。在构造函数、普通函数和箭头函数中,this的指向是不同的。理解this关键字有助于掌握JavaScript中对象的使用和方法的调用。 7. 高阶函数:...

    JavaScript面向对象编程指南

    JavaScript是一种广泛应用于Web开发的动态、弱类型的语言,它的面向对象编程能力是其核心特性之一。面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它基于“对象”的概念,允许程序员创建数据...

    JavaScript面向对象编程指南 pdf

    面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一个重要概念,它允许开发者以更加模块化、可复用的方式组织代码。下面将详细探讨JavaScript面向对象编程的基本原理、特性以及实际应用。 1. **...

    javascript对象转换成json

    在JavaScript中,对象转换成JSON(JavaScript Object Notation)是一种常见的数据交换格式,它轻量级、易读、易写,被广泛应用于Web应用程序之间传递数据。JSON格式是基于JavaScript的一个子集,但它并不是...

    JavaScript面向对象编程指南(第2版).rar

    面向对象编程(Object-Oriented Programming,OOP)是JavaScript中的一个重要概念,它允许开发者通过对象来组织代码,提高可读性和可维护性。本指南的第二版深入探讨了JavaScript的面向对象特性,旨在帮助开发者更好...

    JavaScript面向对象基础.ppt

    在JavaScript中,面向对象编程(OOP)是其核心概念之一,允许开发者通过类和对象来组织和管理代码,提高代码的可重用性和可维护性。 8.1 面向对象术语 面向对象编程的基础包括类、对象、继承和多态等概念。类是对象...

    JavaScript面向对象精要(英文版)

    ### JavaScript面向对象精要 #### 一、概述 《JavaScript面向对象精要》是一本深入讲解JavaScript面向对象编程原理的专业书籍。本书由知名的前端开发者Nicholas C. Zakas撰写,全面介绍了JavaScript作为一种动态...

    JavaScript 面向对象编程详细讲解文档

    JavaScript是一种动态类型的脚本语言,虽然它不像Java或C#那样拥有传统的类和实例机制,但它的面向对象编程能力仍然非常强大。JavaScript的核心在于对象、原型和隐式继承,这些都是理解其面向对象特性的重要概念。 ...

    javascript面向对象编程指南 2nd

    javascript面向对象编程指南 2nd英文版,英文名:Object-Oriented JavaScript。 What you will learn from this book The basics of object-oriented programming, and how to apply it in the JavaScript ...

    javascript面向对象

    ### JavaScript面向对象编程详解 #### 引言 在软件工程领域,面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。每个对象都可以包含数据(属性)和方法(行为)。JavaScript虽然起初并非为面向对象...

    面向对象JavaScript开发

    JavaScript,作为一种广泛应用于Web开发的动态脚本语言,最初被设计为简单的客户端脚本语言,但随着技术的发展,它已经发展出了丰富的面向对象编程(OOP)特性。面向对象JavaScript开发是现代Web开发中不可或缺的一...

    javascript对象参考手册

    JavaScript对象是编程语言的核心组成部分,尤其在Web开发中扮演着至关重要的角色。"JavaScript对象参考手册"涵盖了这一主题的广泛内容,旨在为开发者提供全面、深入的理解和实用指南。手册分为20个章节,不仅涉及...

Global site tag (gtag.js) - Google Analytics