`

JavaScript类和继承:this属性

    博客分类:
  • js
阅读更多
this属性表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window; 如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。 我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。

先看一个在全局作用范围内使用this的例子:
  1. <script type="text/javascript">
  2.   console.log(this === window);  // true  
  3.   console.log(window.alert === this.alert);  // true  
  4.   console.log(this.parseInt("021", 10));  // 10  
  5. </script>
函数中的this属性是在运行时决定的,而不是函数定义时,如下:
  1. // 定义一个全局函数 
  2. function foo() { 
  3.   console.log(this.fruit);  

  4. // 定义一个全局变量,等价于window.fruit = "apple"; 
  5. var fruit = "apple"; 
  6. // 此时函数foo中this指向window对象 
  7. // 这种调用方式和window.foo();是完全等价的 
  8. foo(); // "apple"  

  9. // 自定义一个对象,并将此对象的属性foo指向全局函数foo 
  10. var pack = { 
  11.   fruit: "orange",  
  12.   foo: foo  
  13. }; 
  14. // 此时函数foo中this指向window.pack对象 
  15. pack.foo(); // "orange"

全局函数apply和call可以用来改变函数中this属性的指向,如下:
  1. // 定义一个全局函数 
  2. function foo() { 
  3.    console.log(this.fruit);  

  4.  
  5. // 定义一个全局变量 
  6. var fruit = "apple"; 
  7. // 自定义一个对象 
  8. var pack = { 
  9.    fruit: "orange"
  10. }; 
  11.  
  12. // 等价于window.foo(); 
  13. foo.apply(window); // "apple"  
  14. // 此时foo中的this === pack 
  15. foo.apply(pack);   // "orange"

注:apply和call两个函数的作用相同,唯一的区别是两个函数的参数定义不同。

因为在Java Script中函数也是对象,所以我们可以看到如下有趣的例子:
  1. // 定义一个全局函数 
  2. function foo() { 
  3.   if (this === window) {  
  4.       console.log("this is window.");  
  5.   }  


  6. // 函数foo也是对象,所以可以定义foo的属性boo为一个函数 
  7. foo.boo = function() { 
  8.   if (this === foo) {  
  9.       console.log("this is foo.");  
  10.   } else if (this === window) {  
  11.       console.log("this is window.");  
  12.   }  
  13. }; 
  14. // 等价于window.foo(); 
  15. foo(); // this is window.  

  16. // 可以看到函数中this的指向调用函数的对象 
  17. foo.boo(); // this is foo.  

  18. // 使用apply改变函数中this的指向 
  19. foo.boo.apply(window); // this is window.
分享到:
评论

相关推荐

    Javascript类的继承,使用this.callParent调用超类方法

    当我们谈论类的继承时,我们指的是一个类(子类)可以获取另一个类(父类或超类)的属性和方法,从而实现代码复用和扩展。在本话题中,我们将深入探讨JavaScript中的类继承,并特别关注`this.callParent`这个方法,...

    探索JavaScript的原型链:原型继承的奥秘

    在JavaScript中,原型继承是实现对象间属性和方法共享的关键。 **JavaScript的主要特点:** 1. **解释型语言**:JavaScript代码通常在浏览器中由JavaScript引擎解释执行,无需预先编译。 2. **基于原型的继承**:...

    JavaScript继承

    除了传统的原型链继承,JavaScript还支持其他继承模式,如组合继承(组合使用构造函数和原型链)、寄生继承(通过创建父类副本改进继承)、原型式继承(使用`Object.create()`)、寄生组合式继承(被认为是最有效的...

    javascript中类和继承(代码示例+prototype.js)

    在JavaScript中,类和继承是面向对象编程的重要概念。JavaScript是一种动态类型的语言,它没有像Java或C++那样的传统类,而是使用函数作为构造器来模拟类的行为,并通过原型链实现继承。本文将深入探讨JavaScript中...

    JavaScript中的继承之类继承_.docx

    ### JavaScript中的继承——类继承 #### 一、引言 JavaScript是一种动态的、弱类型的编程语言,它支持面向对象编程模式。与传统的面向对象语言如Java或C#不同,JavaScript的继承模型基于原型,这使得它的继承机制...

    JavaScript类和继承 this属性使用说明

    JavaScript中的`this`属性是一个关键概念,它在类和继承机制中扮演着核心角色。`this`关键字在JavaScript中表示当前执行上下文的对象,它的值取决于函数被调用的方式,而不是函数定义时的位置。理解`this`的工作原理...

    JavaScript类和继承 prototype属性

    我们已经在第一章中使用prototype属性模拟类和继承的实现。 prototype属性本质上还是一个JavaScript对象。 并且每个函数都有一个默认的prototype属性。 如果这个函数被用在创建自定义对象的场景中,我们称这个函数为...

    JavaScript学习之三 — JavaScript实现继承的7种方式

    通过`class`和`extends`关键字,子类可以继承父类的所有属性和方法,而且父类的静态属性和方法也能被继承。这提供了更清晰的语法,但底层仍然是原型链机制。 6. 寄生继承(Parasitic Inheritance) 寄生继承的思想...

    javascript控件开发之继承关系

    在控件开发中,我们通常会创建一个基础控件类,然后让其他特定类型的控件继承这个基础类,以便共享相同的属性和行为。 例如,我们可以定义一个基础的`Control`类,包含通用的属性如位置、大小、样式等,以及通用的...

    JavaScript面向对象继承详解

    5. **寄生组合继承**:结合寄生继承和组合继承,避免了冗余的构造函数调用,通常被认为是JavaScript中实现继承的最佳实践。 6. **ES6的类继承**:ES6引入了`class`语法糖,使得JavaScript的继承看起来更像传统的...

    javascript的prototype继承

    JavaScript的原型继承是其面向对象编程的一大特性,它基于原型链机制实现,允许一个对象可以从另一个对象继承属性和方法。这种继承方式不同于类继承,而是通过将子类的原型对象设置为父类的一个实例来实现。 在...

    JavaScript类和继承 constructor属性

    在JavaScript中,constructor属性是一个非常重要的基础概念,它出现在类(Class)和继承(Inheritance)的实现中。constructor属性主要用于识别创建某个对象的构造函数。通常情况下,构造函数的prototype对象会拥有...

    JavaScript程序设计课件:原型与继承.pptx

    当访问某个对象中的一个不存在的属性或方法时,会自动调用原型中的属性和方法。也就是说,基于原型创建的对象会自动拥有原型的属性和方法。 之前我们学过构造函数,通过构造函数也可以使两个对象具有相同的属性和...

    javascript 继承派生

    **派生**,或称为子类化,是指创建一个新类(子类),该类基于现有类(父类)并可能添加新的属性和方法或者重写已有的。在JavaScript中,可以使用`Object.create()`方法或者通过构造函数的原型链(`new Constructor...

    详解Javascript继承的实现

    本文将深入探讨JavaScript继承的实现方式,以及其中的问题和解决方案。 首先,我们来看混合方式的实现,这种方式结合了原型链和对象冒充。在JavaScript中,构造函数是用于创建特定类型对象的函数。例如,`Employee`...

    无废话ExtJs 系列教程十八[继承:Extend]

    继承在ExtJS中的实现主要基于`Ext.extend()`方法,这个方法是ExtJS提供的一个静态方法,它允许一个类(子类)继承另一个类(父类)的所有属性和方法。通过`Ext.extend()`,我们可以定义新的类,同时保留和扩展已存在...

    JavaScript第一讲:可以做什么

    JavaScript虽然是一种基于原型的面向对象语言,但同样支持类的概念,提供了构造函数、原型链、封装、继承和多态等面向对象特性。 - **构造函数**:用于创建特定类型的对象,通过`new`关键字调用。 - **原型链**:...

Global site tag (gtag.js) - Google Analytics