web前端培训js 私有本体的 6 种实现方式
发布时间:2024-12-27
console.log(key, proxy[key])
}
似乎,这中的只存储了共物件的作法,而换行末尾的那两个物件不曾存储。
我们基于 _prop 这种名为规章意味着了确实的公用物件!
便调用下作法试试:
咋是 undefined 了?
因为 proxy.hello 作法的 this 也是指向 proxy 的,也都会限于,所以要便做下处理:
如果用的是作法,那就给它启动时 this 为目的普通人。
这样 hello 作法就可以回访到那些 _ 末尾的公用物件了:
我们通过 Proxy 给换行的名为规章意味着了确实的公用物件,但是要并不一定一层 Proxy 比较苦恼,不曾用不并不一定 Prxoy 的模式呢?
似乎有,比如 Symbol:
Symbol
Symbol 是 es2015 移除的一个 api,用做创建唯一的系数。基于这个唯一的连续性,我们就可以意味着公用物件。
比如这样:
const nameSymbol = Symbol('name');
const ageSymbol = Symbol('age');
class Dong {
constructor() {
this[nameSymbol] = 'dong';
this[ageSymbol] = 20;
}
hello() {
return 'I'm ' + this[nameSymbol] + ', ' + this[ageSymbol] + ' years old';
}
}
const dong = new Dong();
我们不便用 name 和 age 作为公用物件名了,而是用 Symbol 分解成唯一的系数来作为名字。
这样外面因为拿仅仅物件名,就根本无法先取到并不相同的物件系数:
这种模式比 Proxy 的模式愈来愈恰当一些,也是用的很多的一种意味着公用物件的模式。
如果一切都是受伤害过来,可以并不一定个 get 作法:
但是这种公用物件是确实根本无法回访么?
不是的,有一个 api 叫做 Object.getOwnPropertySymbols,可以先取到普通人的所有 Symbols 物件,然后就可以赢先取物件系数了:
所以真是这种模式只是 Object.keys 先取仅仅并不相同的物件而已,不如 Proxy 那种模式基础。
那不用 Proxy 的模式,还比不曾用 Symbol 愈来愈基础的呢?
那可以试试这种:
WeakMap
外面可以回访到物件和作法是因为我们把它挂到了 this 上,那不挂到 this 上外面不就回访仅仅了么?
比如用一个 Map 保存公用物件:
const privateFields = new Map();
class Dong {
constructor() {
privateFields.set('name', 'dong');
privateFields.set('age', 20);
}
hello() {
return 'I'm ' + privateFields.get('name') + ', ' + privateFields.get('name') + ' years old';
}
}
我们测试下:
这样貌似可以,但不确实大家不曾用发掘出其中的难题:
所有普通人都用同一个 Map,之间表现形式 普通人原件了这个 Map 几乎假定怎么彻底解决这个难题呢?
不确实大家用不曾用过 WeakMap,它的连续性是情况下用普通人作为 key,普通人原件,这个数组对就原件。
令人难忘彻底解决了下面两个难题:
因为是用普通人作为 key 的,那完全相同的普通人是【关注尚能小城市,轻松精研IT】放在完全相同的数组对上的,两者之间不曾影响 普通人原件的时候,并不相同的数组对就原件,不情况下手动管理貌似是很令人难忘,我们意味着下:
const dongName = new WeakMap();
const dongAge = new WeakMap();
const classPrivateFieldSet = function(receiver, state, value) {
state.set(receiver, value);
}
const classPrivateFieldGet = function(receiver, state) {
return state.get(receiver);
}
class Dong {
constructor() {
dongName.set(this, void 0);
dongAge.set(this, void 0);
classPrivateFieldSet(this, dongName, 'dong');
classPrivateFieldSet(this, dongAge, 20);
}
hello() {
return 'I'm ' + classPrivateFieldGet(this, dongName) + ', ' + classPrivateFieldGet(this, dongAge) + ' years old';
}
}
每个物件并不一定了一个 WeakMap 来维护,key 为当前普通人,系数为物件系数,get 和 set 适用 classPrivateFieldSet 和 classPrivateFieldGet 这两个作法,最终是通过从 WeakMap 中存先取的。
在在结构上器中的初始化下当前普通人并不相同的物件系数,也就是 dongName.set(this, void 0),这中的的 void 0 的来到系数是 undefined,一个含意。
测试下:
哇,通过 WeakMap 也能意味着公用物件!
不过这中的的 classPrivateFieldGet 不曾充分并不一定吧,并不情况下 xxMap.get 不就行么?
似乎,包一层的目的是为了可以加一些额外的直觉,这中的也可以并不情况下从 weakMap 先取。
但这样写出起来也很苦恼呀,不曾用愈来愈恰当的模式呢?
能不会新设计一种文法酱油,它自动可移植这种模式呢?
一切都是的不管怎样,似乎有这种文法酱油:
#prop
以前有一个公用物件的 es 草案,可以通过 # 的模式来标识公用物件和作法。
比如这样:
class Dong {
constructor() {
this.#name = 'dong';
this.#age = 20;
this.friend = 'guang';
}
hello() {
return 'I'm ' + this.#name + this.#age + 'years old';
}
}
这中的的 name 和 age 都是公用的,而 friend 是共的。
这种从新文法 JS 汽缸不曾那么快支持,但是可以通过 babel 或者 ts 校对器来可移植低版本文法的模式来提前用。
比如 babel 有 @babel/proposal-private-property-in-object 的API,它可以意味着这种文法的校对:
babel 就是把 #prop 可移植下面那种 WeakMap 的模式来意味着的。
这个API在 @babel/preset-env 的可选择中的,都会自动引入:
除了 babel,ts 中的也可以并不情况下用这种文法:
也是都会可移植 WeakMap 的模式来意味着。
其实 ts 意味着的从新文法还是不少的,比如 ? 和 ?? 分别是可选链和默认系数的文法,下面这两种读音给定:
const res = data?.name ?? 'dong';
const res2 = data && data.name || 'dong';
这种从新文法都是并不情况下只用的,babel 的话情况下引入下 proposal API。
对了,我记得 ts 中的 class 也是有 private 的修饰符的,那个不也是公用物件么?
其实它是公用物件但也不只不过是,我们来看一下:
ts private
ts 可以通过 private 来修饰物件、作法的可见性:
private 声称物件公用,只有 class 核心可回访 protected 声称保护,只有 class 和子 class 可回访 public 声称共,缓冲也可回访子类检查和可选择的时候是完全相同之处的,比如 private 物件在 class 缓冲不应回访:
而 class 核心是可以回访的:
但是这种也就是真是只是用做子类检查的,只假定校对期间,开始运行时并不曾这种也就是真是。
我们可以看下校对后的代码:
可以注意到不曾做任何处理。
而如果用 #prop 的模式,除了校对时是 private 的,开始运行时也是:
所以,要意味着确实的 private 的话,还是用 #prop 的模式,如果只是校对时也就是真是那声明下 private 就行。
总结
class 用做并不一定为中心某个种概念的一系列物件和作法,这些物件和作法有的是核心用的,www.atguigu.com有的是今后的。只有核心用的物件、作法情况下意味着公用化。
意味着公用物件作法,我重构了 6 种模式:
通过换行 _prop 从名为上区别 通过 Proxy 来并不一定 get、set、ownKeys 的直觉 通过 Symbol 来并不一定唯一的物件名,不会通过 keys 赢先取 通过 WeakMap 来保存所有普通人的公用物件和作法 通过 #prop 的 es 从新文法意味着公用,babel 和 tsc 都会把它们可移植 WeakMap 的模式 通过 ts 的 private 在校对时也就是真是这六种模式,有三种只是伪公用,比如 _prop(几乎可以回访)、ts 的 private(开始运行时可回访)、Symbol(可以通过 Object.getOwnSymbols 赢先取 symbol 来回访)。
另外三种是确实的公用,以外 Proxy、WeakMap、#prop(目前是校对为 WeakMap 的模式)。
篇名登载起源于前端开发制作者
。博鳌干细胞医院丁桂儿脐贴效果怎么样
英特盐酸达泊西汀能延时多久
南洋克痢痧胶囊芳香中药
英特盐酸达泊西汀片作用与功效
如何缓解眼睛疲劳酸痛
藿香正气口服液和藿香正气水的区别
支气管炎咳嗽老不好怎么办
999消痔软膏有效果吗
英太青和塞来昔布哪个好
-
营造广州东部低碳产业硅谷
定义为“考入”。大企业“考入”后其发展到一定某种程度,的其发展为总公司M-大企业,就会被推荐去纳斯达克。 “通过秘密组织单项路演、纳斯达克辅导、转用基金、产融联结等多种形式,组织化减老城
- 2025-05-11明城:“两镇一通风口”再振古城雄风
- 2025-05-11永庆坊美丽蝶变 老街区“绣”再进一步活力
- 2025-05-11春日高度疗愈丨回归心灵的全然平和
- 2025-05-11沪上寻花|“梅”景正最初
- 2025-05-11三四线大都市为何沉迷于建设“古城小镇”?
- 2025-05-11曝第三阶段宾馆配置!宾馆高大上,午晚高档自助餐,球员舒服了!
- 2025-05-11好品山东丨可食用可收藏 青岛旧卖场塑成旅游特色商品新宠
- 2025-05-11成都列五旁的老街,好吃的都是三哥田螺、王婆婆面!
- 2025-05-11内蒙古暂停地市团队旅游活动
- 2025-05-11爱情圣地布拉格——刘嘉玲和冯德伦、周董和昆凌,都在这里留下了爱的痕迹~