Đây là cách tiếp cận có thể sử dụng lại để thêm các thuộc tính riêng tư thích hợp:
/**
* Implements proper private properties.
*/
export class Private<K extends object, V> {
private propMap = new WeakMap<K, V>();
get(obj: K): V {
return this.propMap.get(obj)!;
}
set(obj: K, val: V) {
this.propMap.set(obj, val);
}
}
Giả sử bạn có lớp Clientở đâu đó cần hai thuộc tính riêng:
prop1: string
prop2: number
Dưới đây là cách bạn triển khai nó:
// our private properties:
interface ClientPrivate {
prop1: string;
prop2: number;
}
// private properties for all Client instances:
const pp = new Private<Client, ClientPrivate>();
class Client {
constructor() {
pp.set(this, {
prop1: 'hello',
prop2: 123
});
}
someMethod() {
const privateProps = pp.get(this);
const prop1 = privateProps.prop1;
const prop2 = privateProps.prop2;
}
}
Và nếu tất cả những gì bạn cần là một tài sản riêng, thì nó thậm chí còn đơn giản hơn, bởi vì bạn sẽ không cần phải xác định bất kỳ ClientPrivate trong trường hợp đó.
Đáng chú ý, phần lớn, lớp Privatechỉ cung cấp một chữ ký dễ đọc, trong khi việc sử dụng trực tiếp WeakMapthì không.