JavaScript中this指向的问题...
迷茫
迷茫 2017-04-11 11:20:24
0
10
423

1.RT,JS中this指向的问题,让我困扰了很久,也很混乱。我知道

a.全局函数的this指向的是全局;
b.对象内的方法是指向这个对象的;
c.但是闭包里的函数this指向的不是外层函数,而是全局,据说这是语言设计上的缺陷;

可是还有个构造函数,构造函数不使用new来调用的话,里面的this也是指向全局的...,使用new来调用则this指向的是new出来的实例,这些我都了解了些...,那么问题来了,构造函数的原型上的方法里面的this是指向谁的?!

按照我的理解,构造函数的原型也是一个对象,上面的方法应该算作对象的方法,其中的this肯定是指向该对象的,也就是指向构造函数的原型?但是我自己简单试了一下,怎么好像指向的还是new出来的实例对象呢?!

求个明白!THX
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

reply all(10)
黄舟

谢邀。

this 是 Javascript 语言的一个关键字。它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。
在绝大多数情况下,函数的调用方式决定了 this 的值,this不能在执行期间被赋值。 随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是 this 指向总是调用函数的那个对象。

下文绝大部分都是来自this - JavaScript | MDN,只做了点微小的工作,谢谢大家。

看我博客吧
http://www.anchengjian.com/#/...

左手右手慢动作

你要知道函数的4种调用模式

  • 普通函数执行模式:声明一个函数后,直接通过函数的名字调用

    • this指向全局

  • 构造函数模式: 通过 new 操作符 创建一个对象

    • this指向构造函数创建出的对象

  • 方法调用模式:通过对象来调用

    • this指向方法的调用者

  • 上下文模式(call/apply模式)

    • this指向call/apply的第一个参数

Ty80

this的指向在运行时才确定,因此要足够留心其运行时的上下文。
JavaScript 之 this 详解。

Peter_Zhu

主要还是看谁调用这个函数.

function Person(){}
Person.prototype.say = function(){
    console.log( this );
}

var per_1 = new Person();
/*
 *  这个是构造函数的实例调用. per_1 这个对象上没有定义 say 这个方法, 
 *  会沿原型链往上在原型上找到 say 这个方法. 但实际上还是 per_1 这个对象调用 say .
 */
per_1.say();

/*
 *   这个就是原型上调用 say 方法了. 所以这个 this 指向 prototype 对象.
 */
per_1.__proto__.say();

Peter_Zhu

构造函数的this指向构造函数自身,构造函数的原型可以理解为是构造函数的方法,所以里面的this也是指向构造函数的。用new出来的实例对象,继承了构造函数的原型(原型链),可以调用这些方法,所以构造函数原型上的方法也可以理解为是实例的方法,然后就回到了你提到的第二点:b.对象内的方法是指向这个对象的,用实例调用原型上的方法时,方法的内部this指向这个实例对象。

Ty80

谢邀,我大概明白楼主你在纠结什么了。构造函数的this指向的是调用它的实例,这是没有问题了,没有调用它的实例,就不指向任何对象。因为this的指向是由上下文确定的,而你创建了构造函数而不实例一个对象(你也可以认为这个构造函数没有执行),this就不指向任何一个对象

PHPzhong

这里举一个简单的例子

String.prototype.Trim = function()
{
  return this.replace(/(^s*)|(s*$)/g, "");
}

Trim方法里的this就是指的String的一个实例,而不是String.prototype

推荐一篇文章:张鑫旭:原型对象中的this

迷茫

参阅:图解 JavaScript this 指向什么

小葫芦

在js中 this总是指向调用函数的那个对象

PHPzhong

这个回答适合其他语言,JS简单按照这个理解是有一些问题的...

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!