Webpack 基础原理

0. 准备知识

Symbol.toStringTag

Symbol.toStringTag 是一个内置 symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型标签,通常只有内置的 Object.prototype.toString()方法会去读取这个标签并把它包含在自己的返回值里。

说白了,就是希望自己创建的对象能有自己的标签类型[Object Xxxx]

例如,有许多JS对象类型没有toStringTag属性,但还是能通过toString识别特定返回的方法。

Object.prototype.toString.call('foo');     // "[object String]"
Object.prototype.toString.call([1, 2]);    // "[object Array]"
Object.prototype.toString.call(3);         // "[object Number]"
Object.prototype.toString.call(true);      // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null);      // "[object Null]"

我们也想这样创建一个对象,用toString返回其类型标签,但是依然是[Object Object],咱没这待遇… 不过通过 Symbol.toStringTag给了我们vip特权。

let obj = {
   };
Object.defineProperty(obj,Symbol.toStringTag,{
   value: 'MyTagOY'});
console.log( Object.prototype.toString.call( obj ) ) // [object MyTagOY]
class MyTag {
   
    get [Symbol.toStringTag](){
   
        return 'MyTagOY'
    }
}
console.log( Object.prototype.toString.call( new MyTag() ) ) // [object MyTagOY]

Object.create(proto)

方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
参数 proto:新创建对象的原型对象

Object.create(null) 创建一个非常纯洁的对象,可以自己定义自己的hasOwnPropertytoString等方法。使用for...in遍历对象时,不需要在对原型属性进行检查了。

Object.create()的原理:

if( typeof Object.create != 'function' ){
   
	Object.create = function(proto){
   
		function F(){
   }; // 构造函数
		F.prototype = proto;
		return new F();
	}
}

getter

defineProperty 方法会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回这个对象。

复习一下 Object.defineProperty(obj, prop, descriptor)
obj:要在其上定义属性的对象。prop:要定义或修改的属性的名称。descriptor:属性描述符。

对于描述符:
configurable:属性是否可配置。默认值为false。

let obj = {
   };
Object.defineProperty(obj,'name',{
   
	value: 1
})

// 1. 试图去删除name属性时,属性是不可删除的。
console.log( delete obj.name ) ; console.log( Reflect.deleteProperty(o,'name') );
// 2. 试图再次去修改value, 会报错。
Object.defineProperty(obj,'name',{
   
	value: 2
})
// TypeError: Cannot redefine property: key
// 3. 配置writable为true后,可以修改值,注意writable只可以单向从true变为false,相反会报错。
Object.defineProperty(obj,'name',{
   
	value: 1,
	writable: true
});
Object.defineProperty(obj,'name',{
   
	value: 2
	writable: false
})
console.log(obj.name) // 2
// 4. 我们从value + writable这种数据描述符,转换到get + set这种存取描述符,也会报错。
Object.defineProperty(o, 'name', {
   
    value: 1,
	writable: true
})
console.log(o.key) // 1
Object.defineProperty(o, 'name', {
   
    get(){
   
		return '2'
	}
})
//5. 从一个存取描述符,转换到另一个存取描述符,也是报错的。
Object.defineProperty(o, 'name', {
   
    get () {
   
    	return 1;
    }
})
console.log
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Webpack基础原理是将项目中所有的模块都视为一个依赖关系图,然后根据入口文件进行递归分析,将所有的依赖模块打包成一个或多个打包后的文件。Webpack的打包过程主要包括以下几个步骤: 1. 解析模块:Webpack会解析所有的模块,包括模块的依赖关系、模块类型等。 2. 执行loader:Webpack会根据模块的类型执行相应的loader,将模块转换成一个可执行的JavaScript代码。 3. 分析依赖:Webpack会分析每个模块的依赖关系,确定模块的依赖关系图。 4. 打包模块:Webpack会将所有的模块打包成一个或多个文件,同时生成打包后的代码和资源文件。 打包后的文件解读: Webpack打包后的文件主要包括两个部分:运行时代码和打包后的模块代码。 运行时代码是Webpack在运行时需要的一些代码,例如模块加载函数、模块缓存等等。 打包后的模块代码是Webpack根据依赖关系图打包后的模块代码,这些代码可能被压缩、合并、优化等处理过。每个模块都被包装在一个函数中,这个函数可以接受其他模块作为参数,同时也可以导出自己的API供其他模块使用。打包后的模块代码的顺序和结构都是由Webpack根据依赖关系图自动决定的。 总之,Webpack打包后的文件是一个可执行的JavaScript文件,包含了项目中所有的模块和资源,并且可以在浏览器或Node.js环境中运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值