Sea*_*man 102 javascript typescript
我正在寻找TypeScript中私有成员的实现,我发现它有点令人困惑.Intellisense不允许访问私有成员,但在纯JavaScript中,它就在那里.这让我觉得TS没有正确实现私有成员.有什么想法吗?
class Test{
private member: any = "private member";
}
alert(new Test().member);
Run Code Online (Sandbox Code Playgroud)
Guf*_*ffa 90
与类型检查一样,成员的隐私仅在编译器中强制执行.
私有属性是作为常规属性实现的,并且不允许类外的代码访问它.
要在类中创建真正私有的东西,它不能是类的成员,它将是在创建对象的代码内的函数范围内创建的局部变量.这意味着你不能像类的成员那样访问它,即使用this
关键字.
Mar*_*tin 36
JavaScript确实支持私有变量.
function MyClass() {
var myPrivateVar = 3;
this.doSomething = function() {
return myPrivateVar++;
}
}
Run Code Online (Sandbox Code Playgroud)
在TypeScript中,这将表达如下:
class MyClass {
doSomething: () => number;
constructor() {
var myPrivateVar = 3;
this.doSomething = function () {
return myPrivateVar++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
这种方法只能用于少量的地方是绝对必要的.例如,如果您需要临时缓存密码.
使用这种模式会产生性能成本(与Javascript或Typescript无关),只能在绝对必要的地方使用.
Prz*_*ski 19
由于 TypeScript 3.8 将发布,您将能够声明在包含 class 之外无法访问甚至无法检测到的私有字段 。
class Person {
#name: string
constructor(name: string) {
this.#name = name;
}
greet() {
console.log(`Hello, my name is ${this.#name}!`);
}
}
let jeremy = new Person("Jeremy Bearimy");
jeremy.#name
// ~~~~~
// Property '#name' is not accessible outside class 'Person'
// because it has a private identifier.
Run Code Online (Sandbox Code Playgroud)
私有字段以#
字符开头
请注意,这些私有字段将与用private
关键字标记的字段不同
参考 https://devblogs.microsoft.com/typescript/annoucing-typescript-3-8-beta/
Rya*_*mas 11
一旦支持WeakMap是更广泛的应用存在例如#3详述了一个有趣的技术在这里.
它允许私有数据并通过允许从原型方法而不仅仅是实例方法访问数据来避免Jason Evans示例的性能成本.
链接的MDN WeakMap页面列出了Chrome 36,Firefox 6.0,IE 11,Opera 23和Safari 7.1的浏览器支持.
let _counter = new WeakMap();
let _action = new WeakMap();
class Countdown {
constructor(counter, action) {
_counter.set(this, counter);
_action.set(this, action);
}
decrement() {
let counter = _counter.get(this);
if (counter < 1) return;
counter--;
_counter.set(this, counter);
if (counter === 0) {
_action.get(this)();
}
}
}
Run Code Online (Sandbox Code Playgroud)
感谢 Sean Feldman 提供有关此问题的官方讨论的链接 - 请参阅他对链接的回答。
我阅读了他链接到的讨论,以下是要点摘要:
this
某种解决方法,它们将无法访问@private
识别注释可以有效地缩小方法名称的缩小器对私有方法进行注释
在发出的代码中添加可见性支持的总体反驳:
归档时间: |
|
查看次数: |
71978 次 |
最近记录: |