ホームページ > 記事 > ウェブフロントエンド > ES6におけるプライベート変数の実装概要(コード例)
この記事は、ES6 でのプライベート変数の実装 (コード例) をまとめたものです。必要な方は参考にしていただければ幸いです。
「ECMAScript 6 入門」を読んでいると、プライベート変数の実装が散見されたので、ここにまとめておきます。
class Example { constructor() { this._private = 'private'; } getName() { return this._private } } var ex = new Example(); console.log(ex.getName()); // private console.log(ex._private); // private
簡単な書き方
/** * 实现一 */ class Example { constructor() { var _private = ''; _private = 'private'; this.getName = function() {return _private} } } var ex = new Example(); console.log(ex.getName()); // private console.log(ex._private); // undefined
##外部アクセスおよび変更ができない
デメリット
メソッドはプロトタイプではなくインスタンスに存在し、サブクラスはスーパーを使用して呼び出すことができません。
構築により若干のオーバーヘッドが追加されます
/** * 实现二 */ const Example = (function() { var _private = ''; class Example { constructor() { _private = 'private'; } getName() { return _private; } } return Example; })(); var ex = new Example(); console.log(ex.getName()); // private console.log(ex._private); // undefined利点
実装
const Example = (function() { var _private = Symbol('private'); class Example { constructor() { this[_private] = 'private'; } getName() { return this[_private]; } } return Example; })(); var ex = new Example(); console.log(ex.getName()); // private console.log(ex.name); // undefined
/** * 实现一 */ const _private = new WeakMap(); class Example { constructor() { _private.set(this, 'private'); } getName() { return _private.get(this); } } var ex = new Example(); console.log(ex.getName()); // private console.log(ex.name); // undefined
/** * 实现二 */ const Example = (function() { var _private = new WeakMap(); // 私有成员存储容器 class Example { constructor() { _private.set(this, 'private'); } getName() { return _private.get(this); } } return Example; })(); var ex = new Example(); console.log(ex.getName()); // private console.log(ex.name); // undefined
パフォーマンスに一定のコストがかかります
#
class Point { #x; #y; constructor(x, y) { this.#x = x; this.#y = y; } equals(point) { return this.#x === point.#x && this.#y === point.#y; } }#。 ##それでは、プライベート フィールドを直接使用しないのはなぜでしょうか?例:
class Foo { private value; equals(foo) { return this.value === foo.value; } }
たとえば、# を使用せずに、private を使用するとします。キーワード :
class Foo { private value = '1'; equals(foo) { return this.value === foo.value; } } var foo1 = new Foo(); var foo2 = new Foo(); console.log(foo1.equals(foo2));
を直接実行すると、値は絶対に取得できません。結局、プライベート変数ですが、equals は Foo のクラスメソッドなので、取得できるでしょうか。
答えは「はい」です。
実際、これは Java や C などの他の言語でも同じです。
クラスのメンバー関数は、同じ型のインスタンスのプライベート変数にアクセスできます。これは、プライベート性があるためです。実装の場合、「外部」情報はクラス自体の中に隠蔽されます。プライベート変数へのアクセスを禁止する必要はありません。さらに、これはオブジェクトではなくクラスに基づいていることも理解できます。ユーザーにBringの利便性を提供します。 値を取得できるため、出力された結果は true になるはずですが、渡した値が Foo のインスタンスではなく、別のオブジェクトの場合はどうなるでしょうか。var foo1 = new Foo(); console.log(foo1.equals({ value: 2 }));
もちろん、ここのコードは正常に実行できますが、コンパイラにとっては少し面倒です。コンパイラは、value が通常のプロパティであるか foo のプライベート プロパティであるかを認識しないため、コンパイラは判定を行うには、まず foo が Foo のインスタンスであるかどうかを判断し、次に値を取得します。
これは、属性アクセスごとにそのような判断を行う必要があり、エンジンは属性アクセスを中心に高度に最適化されているため、変更が非常に遅く、速度も低下することも意味します。 ただし、この作業に加えて、次のような考慮すべき点がいくつかあります。 秘密キーを各字句環境にエンコードする必要があります for in これらのプロパティを通過できますか? プライベート属性と通常の属性が同じ名前を持つ場合、誰が誰をブロックするのでしょうか?
以上がES6におけるプライベート変数の実装概要(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。