当前位置:首页 >> 中医新闻 >> web前端培训js 私有本体的 6 种实现方式

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消痔软膏有效果吗
英太青和塞来昔布哪个好
标签:
友情链接: