JS逆向实战_this指向

1、使用 new 调用构造函数

当你用 new 来调用一个函数时,JS 会做三件事:

  1. 创建一个新对象 obj。
  2. 把构造函数的 this 指向这个新对象 obj。
  3. 执行构造函数体内的代码,通常会给 this 添加属性和方法。
  4. 默认返回 this(即新创建的对象)。

示例

  function Person(name) {
this.name = name;
this.sayHello = function() {
    console.log(`Hello, my name is ${this.name}`);
  }
}

const p1 = new Person("Alice");
p1.sayHello(); // Hello, my name is Alice

这里,this 指向 p1,即新创建的对象。

2、不使用 new 调用构造函数

如果直接调用函数而不使用 new,this 指向调用时的环境:

严格模式 (‘use strict’):this 为 undefined

非严格模式:this 为全局对象(浏览器中是 window)

示例:

function Person(name) {
this.name = name;
}

Person("Bob"); // 普通调用
console.log(window.name); // "Bob"(非严格模式)

3、构造函数返回对象

如果构造函数显式返回一个对象,那么 new 会返回这个对象,而不是 this:

function Person(name) {
this.name = name;
return { age: 30 };
}

const p = new Person("Alice");
console.log(p); // { age: 30 }

如果返回的是非对象(如字符串、数字),this 仍然被返回。

在这里插入图片描述

4、构造函数和原型方法

如果你在 prototype 上添加方法,这些方法属于共享的原型对象,但 this 的指向依然取决于调用者。

示例:

function Person(name) {
this.name = name; // 实例属性
}

// 原型方法
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};

const p1 = new Person("Alice");
p1.sayHello(); // Hello, my name is Alice

这里:
sayHello 是 Person.prototype 上的方法。
当你通过 p1.sayHello() 调用时,this 指向 **调用它的对象 p1。

this 的本质

在 JS 中,函数执行时的 this 由调用方式决定:

  1. 对象调用(obj.fn()) → this 指向调用者 obj
  2. 普通函数调用(fn()) → 严格模式下 undefined,非严格模式下指向全局对象
  3. 构造函数调用(new Fn()) → this 指向新对象
  4. 箭头函数 → this 继承自定义函数外层的作用域

所以,即使方法在原型上,this 依然是调用它的实例对象。

示例对比

function Person(name) {
this.name = name;
}

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

const p1 = new Person("Alice");
const p2 = new Person("Bob");

p1.sayHello(); // Alice
p2.sayHello(); // Bob

const f = p1.sayHello;
f(); // 严格模式下 undefined, 非严格模式下 window.name

说明:原型方法和实例方法本质上都是函数。this 并不固定在原型上,而是调用它的对象。

5、总结

构造函数原型方法的 this 指向调用它的对象实例。
如果直接把方法取出来调用(函数调用),this 不再指向实例,而受严格模式或全局环境影响。
原型方法适合共享函数,避免每个实例都重复创建同一个函数。

文章来源网上,侵权请联系博主

题外话

黑客&网络安全如何学习

如果你也对网路安全技术感兴趣,但是又没有合适的学习资源,我可以把私藏的网安学习资料免费共享给你们,来看看有哪些东西。

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的的网安视频教程,内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,100多本网安电子书,最新学习路线图和工具安装包都有,不用担心学不全。
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值