js逆向记录

技巧

1,理解webpack的加载器,调用器
2,对this的作用域机制和对象有清晰理解,知道任何情况下this指的什么对象。
3,对new和Function有较为深入的理解,清晰new和Function的初始化机制,默认做了什么动作。

js实现自己的new

关键字new在调用构造函数的时候其实执行了一下几个步骤:

1.创建对象
2.修改此对象的原型,让指向其传入的构造函数的原型对象
3.指向构造函数中的代码(为这个对象添加属性)
4.返回新对象

知道原理,手动实现一个new

function  New(fn,...args){
        // 创建一个对象,其对象的原型,指向构造函数的原型对象
    let obj =Object.create(fn.prototype)
 
 
        // 指向构造函数中的代码,并修改this,指向obj
    let result= fn.apply(obj,args)
 
 
        // 构造函数本身如果返回的是对象的话,则 返回的就是此对象
        //    如果返回值不是对象的话,则 返回对应的obj
    return  result instanceof Object ? result:obj
}
 
function A(a,b){
    this.a=a
    this.b=b
}
const  d =New(A,1,2)
 
console.log(d.a);  //1
console.log(d.b); //2

注意: new 构造函数, 如果此构造函数 有返回值,且返回值是对象的话,则就返回此对象本身。
所以最后判断一下,返回值是不是对象,如果不是,则返回obj

JavaScript 中 call()、apply()、bind() 的用法

参考:
https://www.runoob.com/w3cnote/js-call-apply-bind.html
https://www.cnblogs.com/Shd-Study/p/6560808.html

JavaScript 中 arguments

JavaScript中的new

js引用类型之Function类型-new Function()

定义:引用类型是一种数据结构,用于将数据和功能组织在一起,引用类型有时候也被称为对象定义
第一种方式

//对于创建一个字符串的函数

var test = new Function('arg','console.log(arg+1)');
test(2) ; //3

//其等价于

var test = function(arg) {
  console.log(arg + 1);
}
test(2); // 3

第二种方式

var test = new Function(arg,'console.log(arg+1)');
var arg = 2;
test();//3

第三种方式

我们甚至不需要显式地传参数给这个函数。我们使用apply方法来调用它。它会自动设定函数执行的上下文。这就是为什么我们能在函数里面使用this.arg。这里this指向data对象。

var data = {arg:2}
var test = new Function('console.log(this.age+1)').apply(data); //3

理解下面代码-new(function(){})

n = new(function(){
	console.log(123,this,arguments);
	return function(){
		console.log(456,this,arguments);
	}
})
n //ƒ (){console.log(456,this,arguments);}
n({setime: 789})
n = new(function(){
	console.log(123,this,arguments);
	return 111
})
n //{}

n = new(function(){
	console.log(123,this,arguments);
	return {'aaa':'111'}
})
n  //{aaa: '111'}

new会执行括号里面定义的函数并返回一个对象或函数

!function

!function 是一种常见的 JavaScript 语法,用于创建立即执行函数表达式(Immediately Invoked Function Expression,IIFE)并对其结果进行逻辑非(logical NOT)运算。

IIFE 是一个用于创建匿名函数并立即执行的常用模式。它具有以下形式:

(function() {
  // 函数体内的代码
  console.log("IIFE executed");
})();

在这个模式中,函数被包裹在括号中,并紧接着的括号对立即调用该函数。这样做的目的是为了创建一个函数作用域,并立即执行其中的代码。这有助于避免变量泄露到全局作用域,同时可以创建私有变量和函数。

而在 !function 的语法中,! 是逻辑非运算符,用于将表达式的结果转换为布尔值的相反值。在这种情况下,我们使用逻辑非运算符 ! 对匿名函数进行逻辑非运算,将其结果转换为布尔值。

以下是一个示例,演示如何使用 !function 创建一个立即执行函数表达式并对其结果进行逻辑非运算:

!function() {
  console.log("IIFE executed");
}();

在这个示例中,我们创建了一个匿名函数并立即执行它。匿名函数被包裹在 ! 运算符中,并通过 () 进行立即调用。当这段代码执行时,匿名函数内的代码将被执行,并在控制台中输出 “IIFE executed”。

逻辑非运算符 ! 将函数的执行结果转换为布尔值的相反值。在这个示例中,由于逻辑非运算符的作用,函数的执行结果将被转换为 false 的布尔值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值