美文网首页
js中的this对象

js中的this对象

作者: 大写的Q | 来源:发表于2017-12-18 19:04 被阅读0次

js中的this总会指向一个对象,具体是哪个对象就由运行时函数的执行环境而决定了。
在实际应用中,this的常用指向大致为4种:

1. 作为对象的方法调用

函数作为对象的方法被调用时,this指向该对象

var obj = {
  a: 1,
  getA: function() {
    alert(this===obj);
    alert(this.a);
  }
}

obj.getA(); // 输出:1
2. 作为普通函数调用

函数作为普通函数方式被调用时,this指向全局对象,即window对象。

window.name = 'global';
var myObj = {
  name: 'func',
  getName: function() {
    return this.name;
  }
}

var getName = myObj.getName;
console.log(getName()); // 输出:global
3. 构造器调用

new运算符使得构造器看起来更像一个类。当用new运算符调用函数时, 该函数总会返回一个对象,通常情况下this就指向返回的这个对象。例如:

window.name = 'aaa';
var myObj = function(){
  this.name = 'bbb';
}

var obj = new myObj();
alert(obj.name); // 输出:bbb

但是如果构造器显式地返回了一个object类型的对象,那么运算结果最终会返回这个对象。

window.name = 'aaa';
var myObj = function(){
  this.name = 'bbb';
  return {
    name: 'ccc'
  }
}

var obj = new myObj();
alert(obj.name); // 输出:ccc

或者:

window.name = 'aaa';
var myObj = function(){
  this.name = 'bbb';
  var anotherName = {
    name: 'ccc'
  }
  return anotherName;
}

var obj = new myObj();
alert(obj.name); // 输出:ccc
4. Function.prototype.call或者Function.prototype.apply调用

用call或者apply可以动态改变传入函数的this

var obj1 = {
  name: 'aaa',
  getName: function() {
    return this.name;
  }
}

var obj2 = {
  name: 'bbb'
}

console.log(obj1.getName()); // 输出:aaa
console.log(obj2.getName.call(obj2)); // 输出:bbb

或者:

 var obj1 = {
 name: 'aaa'
 }

 var obj2 = {
 name: 'bbb'
 }

 window.name = 'global'

 var getName = function() {
 alert(this.name);
 }

 getName(); // 输出:global
 getName.call(obj1); //输出: aaa
 getName.call(obj2); //输出:bbb

之前面试遇到过一个问题,下面这种情况会不会报错,为什么?

var getId = document.getElementById;
getId('div1');

答案是会报错,因为正常情况下getElementById方法作为document对象的属性被调用时,this是指向document的,但此时getId引用了getElementById,又被调用的情况就属于普通函数调用了,函数内部的this指向了windows而不是document。可以用apply对这个错误进行修正:

document.getElementById = (function(func){
  return function() {
    return func.apply(document, arguments);
  }
})(document.getElementById);

var getId = document.getElementById;
var div = getId('div1');
console.log(div.id); // 输出:div1

参考:
《Javascript设计模式与开发实践》

相关文章

  • JS 对象

    JS对象 JS对象的意义和声明 在JS中,对象(OBJECT)是JS语言的核心概念,也是最重要的数据类型。在JS中...

  • js 对象和jquery对象的比较

    1、js 对象和jquery对象的区别 jquery对象是js中的new Object()生成的普通对象 2、js...

  • jQuery前端框架--笔记

    1,JS对象和jQuery对象的区别 jQuery就是JS中的new Object生成的普通对象。 2,JS对象和...

  • JavaScript中的Object对象

    JavaScript中的Object对象,是JS中所有对象的基类,也就是说JS中的所有对象都是由Object对象衍...

  • js中的this对象

    js中的this总会指向一个对象,具体是哪个对象就由运行时函数的执行环境而决定了。在实际应用中,this的常用指向...

  • js中的对象

    js中的对象理解和使用起来都很简单,并且很频繁的使用。但是,总有细节,是我们可能会忽略的、或者是拿捏不定的参考链接...

  • js中的对象

    1. 属性的查看 查看一个对象的所有属性,可以使用Object.keys()方法 2. 属性的删除 delete命...

  • JS中的对象

    一、调用系统构造函数与字面量方式   我们可以直接通过 new Object() 创建:   每次创建通过 new...

  • JS中的全局对象、原型与原型链

    一、JS中全局对象与浏览器中的全局对象 JS中默认全局对象是global,而在浏览器的全局对象是window,如w...

  • JavaScript进阶之:八、对象的动态特性

    js中的对象具有动态特性: js支持在对象定义之后,动态的 添加 / 修改 / 删除 / 查询 对象的成员:对象的...

网友评论

      本文标题:js中的this对象

      本文链接:https://www.haomeiwen.com/subject/ydzfkxtx.html