gpt4 book ai didi

javascript - ES6 类中的 protected 属性(使用符号?)

转载 作者:太空宇宙 更新时间:2023-11-04 03:30:25 24 4
gpt4 key购买 nike

问题:

如何以优雅的方式在 ES6 类中实现 protected 属性? (只能从子类内部访问)

I am not searching a response like "ES don't have protected/package properties". It is already known. I want a nice and cleaner workaround to emulate protected properties.

我不想添加安全性。仅向 API 的所有最终用户提供更清晰的公开接口(interface)

<小时/>

示例:

我有以下API:( Node )

我的类.js:

let Symbols = {
_secret: Symbol("_secret")
};
class MyClass {
constructor() {
this.public = "This is public";
this[Symbols._secret] = "This is private";
}
}
// Set the Symbols to a static propietry so any class can access it and extend it
MyClass[Symbol.for("_Symbols")] = Symbols;
module.exports = MyClass

my-child-class.js:

let MyClass = require("./my-class.js");

// extends protected properties with own properties
Symbols = Object.assign({}, MyClass[Symbol.for("_Symbols")] , {
_childSecret = Symbol("_childSecret")
});

class MyChildClass extends MyClass {
constructor() {
super();
this[Symbols._childSecret] = "This is also private";
console.log(this[Symbols._secret]); //logs "this is private"
console.log(this[Symbols._childSecret]); //logs "this is also private"
}
}
// Set the Symbols to a static propietry so any class can access it and extend it
MyClass[Symbol.for("_Symbols")] = Symbols;
module.exports = MyChildClass;

使用该类:

let MyChildClass = require("./my-child-class.js");
var c = new MyChildClass();

优点:

  • 公开的 API 更干净。 API 的最终用户可以查看公开的方法。

问题:

  • 代码在基类中“漂亮”,但在子类中就不那么漂亮了。有什么办法可以改善订单吗?

  • 任何可以访问 Symbol.for("_Symbols") 的人都可以访问 API 的所有 protected /私有(private)属性。 (编辑: 我不介意这一点。这对我来说不是问题,因为如果有人想破坏访问内部符号的 API,那是他们的错)

最佳答案

声明:使用模块和符号是 ES2015+ 中的一种信息隐藏技术(但是使用符号的类属性将被隐藏,而不是严格私有(private) - 根据 OP 问题和假设)。

通过 ES2015 模块(只会导出您声明导出的内容)和 ES2015 symbols 的组合可以实现轻量级信息隐藏。 。 Symbol 是一种新的内置类型。每个新的符号值都是唯一的。因此可以用作对象的键。

如果客户端调用代码不知道用于访问该 key 的符号,则它们无法获取它,因为该符号未导出。示例:

vehicle.js

const s_make = Symbol();
const s_year = Symbol();

export class Vehicle {

constructor(make, year) {
this[s_make] = make;
this[s_year] = year;
}

get make() {
return this[s_make];
}

get year() {
return this[s_year];
}
}

并使用模块vehicle.js

client.js

import {Vehicle} from './vehicle';
const vehicle1 = new Vehicle('Ford', 2015);
console.log(vehicle1.make); //Ford
console.log(vehicle1.year); // 2015

然而,符号虽然是唯一的,但实际上并不是私有(private)的,因为它们是通过像 Object.getOwnPropertySymbols 这样的反射功能公开的......

const vals = Object.getOwnPropertySymbols(vehicle1);
vehicle1[vals[0]] = 'Volkswagon';
vehicle1[vals[1]] = 2013;
console.log(vehicle1.make); // Volkswagon
console.log(vehicle1.year); // 2013

请记住这一点,尽管混淆已经足够,但可以考虑这种方法。

关于javascript - ES6 类中的 protected 属性(使用符号?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38778615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com