ãã©ã¤ãã¼ãè¦ç´ ã¯ããããªãã¯ã§ããé常ã®ã¯ã©ã¹ããããã£ãä¾ãã°ã¯ã©ã¹ãã£ã¼ã«ããã¯ã©ã¹ã¡ã½ãããªã©ã«å¯¾ãããã®ã§ãããã©ã¤ãã¼ãè¦ç´ ã¯ããã·ã¥ #
æ¥é è¾ã使ç¨ãã¦ä½æãããã¯ã©ã¹ã®å¤é¨ããåæ³çã«åç
§ãããã¨ã¯ã§ãã¾ããããããã®ã¯ã©ã¹ããããã£ã®ãã©ã¤ãã·ã¼ã«ãã»ã«å㯠JavaScript èªèº«ã«ãã£ã¦å¼·å¶ããã¾ãããã©ã¤ãã¼ãè¦ç´ ã«ã¢ã¯ã»ã¹ããã«ã¯ããããè¨æ³ã使ç¨ãããããªããã¾ãããã®ã¢ã¯ã»ã¹ã¯ãã©ã¤ãã¼ãè¦ç´ ãå®ç¾©ããã¯ã©ã¹å
ã§ã®ã¿å¯è½ã§ãã
ãã©ã¤ãã¼ãè¦ç´ ã¯ããã®æ§æãåå¨ãã以åã¯ãã¤ãã£ãã§ã¯ããã¾ããã§ããããããã¿ã¤ãç¶æ¿ã§ã¯ã WeakMap
ãªãã¸ã§ã¯ããã¯ãã¼ã¸ã£ã§ãã®æ¯ãèããã¨ãã¥ã¬ã¼ããããã¨ãã§ãã¾ããã使ããããã®é¢ãã㯠#
æ§æã«ã¯ããªãã¾ããã
ã¡ã¢: MDN ã§ã¯ãããã©ã¤ãã¼ãããããã£ãã¨ããç¨èªã®ä½¿ç¨ã¯é¿ãã¦ãã¾ããJavaScript ã®ããããã£ã«ã¯æååã¾ãã¯ã·ã³ãã«ã®ãã¼ããããwritable
ãenumerable
ãconfigurable
ãªã©ã®å±æ§ãããã¾ããããã©ã¤ãã¼ãè¦ç´ ã«ã¯ãããã®å±æ§ã¯åå¨ãã¾ããããã©ã¤ãã¼ãè¦ç´ ã¯ãããªãã¿ã®ããã表è¨ã§ã¢ã¯ã»ã¹ã§ãã¾ããããããã·ã¼ãè¡ã£ãããåæããããåé¤ãããã Object
ã¡ã½ããã使ç¨ãã¦å¯¾è©±ããããããã¨ã¯ã§ãã¾ããã
class ClassWithPrivate {
#privateField;
#privateFieldWithInitializer = 42;
#privateMethod() {
// â¦
}
static #privateStaticField;
static #privateStaticFieldWithInitializer = 42;
static #privateStaticMethod() {
// â¦
}
}
ããã«ããã¤ãã®æ§æä¸ã®å¶ç´ãããã¾ãã
#constructor
ã«ãããã¨ãã§ãã¾ãããã»ã¨ãã©ã®ã¯ã©ã¹ããããã£ã«ã¯ããã©ã¤ãã¼ãã®å¯¾å¿ãããã®ãããã¾ãã
ãããã®æ©è½ãã¾ã¨ãã¦ãã©ã¤ãã¼ãè¦ç´ ã¨å¼ã³ã¾ããããããJavaScript ã§ã³ã³ã¹ãã©ã¯ã¿ã¼ããã©ã¤ãã¼ãã«ãããã¨ã¯ã§ãã¾ãããã¯ã©ã¹ã®å¤é¨ã§ã¯ã©ã¹ãæ§ç¯ãããªãããã«ããã«ã¯ããã©ã¤ãã¼ããã©ã°ã使ç¨ããå¿ è¦ãããã¾ãã
ãã©ã¤ãã¼ãè¦ç´ 㯠# ååï¼ãããã·ã¥-ååãã¨èªã¿ã¾ãï¼ã§å®£è¨ãããæ¥é è¾ã¨ã㦠#
ãä»ãããã¾ããããã·ã¥æ¥é è¾ã¯ããããã£åã®ä¸é¨ã§ããå¤ãã¢ã³ãã¼ã¹ã³ã¢æ¥é è¾è¦ç´ _privateField
ã¨ã®é¢ä¿ãæãæãã¦ãã ãããããããæ®éã®æååããããã£ã§ã¯ãªãã®ã§ããã©ã±ããè¨æ³ã使ã£ã¦åçã«ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã
ã¯ã©ã¹å¤ãã #
ä»ãã®åãåç
§ããã¨æ§æã¨ã©ã¼ã«ãªãã¾ããã¾ããå¼ã³åºãããåã«å®£è¨ããã¦ããªããã©ã¤ãã¼ãè¦ç´ ãåç
§ãããã宣è¨ããã¦ããè¦ç´ ã delete
ã§åé¤ãããã¨ãã¦ãæ§æã¨ã©ã¼ã«ãªãã¾ãã
class ClassWithPrivateField {
#privateField;
constructor() {
delete this.#privateField; // Syntax error
this.#undeclaredField = 42; // Syntax error
}
}
const instance = new ClassWithPrivateField();
instance.#privateField; // Syntax error
JavaScript ã¯åçè¨èªã§ãããããã·ã¥èå¥åã®æ§æãç¹æ®ã§ãããæ§æã¬ãã«ã§é常ã®ããããã£ã¨ã¯ç°ãªãããããã®ã³ã³ãã¤ã«æãã§ãã¯ãè¡ããã¨ãã§ãã¾ãã
ã¡ã¢: Chrome ã³ã³ã½ã¼ã«ã§å®è¡ããã³ã¼ãã¯ãã¯ã©ã¹å¤ãããã©ã¤ãã¼ãè¦ç´ ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãããã㯠JavaScript ã®æ§æå¶éãéçºè ãã¼ã«éå®ã§ç·©åãããã®ã§ãã
ãããã©ã¤ãã¼ãè¦ç´ ãæã£ã¦ããªããªãã¸ã§ã¯ããããã®è¦ç´ ã«ã¢ã¯ã»ã¹ããã¨ãé常ã®ããããã£ã®ããã« undefined
ãè¿ãã®ã§ã¯ãªããTypeError
ãçºçãã¾ãã
class C {
#x;
static getX(obj) {
return obj.#x;
}
}
console.log(C.getX(new C())); // undefined
console.log(C.getX({})); // TypeError: Cannot read private member #x from an object whose class did not declare it
ãã®ä¾ã§ã¯ãéç颿°ã®ä¸ããå¤é¨ã§å®ç¾©ããã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã§ããã©ã¤ãã¼ãè¦ç´ ã«ã¢ã¯ã»ã¹ã§ãããã¨ã示ãã¦ãã¾ãã
in
æ¼ç®åã使ç¨ããã¨ãå¤é¨ã§å®ç¾©ããããªãã¸ã§ã¯ãããã®ãã©ã¤ãã¼ãè¦ç´ ãæã£ã¦ãããã©ããã調ã¹ããã¨ãã§ãã¾ãããã®ãã©ã¤ãã¼ããã£ã¼ã«ãã¾ãã¯ã¡ã½ãããåå¨ããå ´åãtrue
ãè¿ããããã以å¤ã®å ´å㯠false
ãè¿ããã¾ãã
class C {
#x;
constructor(x) {
this.#x = x;
}
static getX(obj) {
if (#x in obj) return obj.#x;
return "obj must be an instance of C";
}
}
console.log(C.getX(new C("foo"))); // "foo"
console.log(C.getX(new C(0.196))); // 0.196
console.log(C.getX(new C(new Date()))); // the current date and time
console.log(C.getX({})); // "obj must be an instance of C"
ãªãã¸ã§ã¯ããç¾å¨ã®ã¯ã©ã¹ã®ãã©ã¤ãã¼ãè¦ç´ ã 1 ã¤ã§ãæã£ã¦ãããã¨ãè¦ã¤ãã£ãå ´åï¼try...catch
ã¾ã㯠in
ãã§ãã¯ã®ããããï¼ãä»ã«ããã©ã¤ãã¼ãè¦ç´ ããã¹ã¦æã£ã¦ããå¿
è¦ãããã¾ããããã¯ã©ã¹ã®ãã©ã¤ãã¼ãè¦ç´ ãæã¤ãªãã¸ã§ã¯ãã¯ãä¸è¬çã«ãã®ã¯ã©ã¹ã«ãã£ã¦æ§ç¯ããããã¨ãæå³ãã¦ãã¾ãï¼å¸¸ã«ã§ã¯ããã¾ããï¼ã
ãã©ã¤ãã¼ãè¦ç´ ã¯ãç¾å¨ã®ã¯ã©ã¹æ¬ä½å
ã§ã®ã¿ã¢ã¯ã»ã¹ãããã¨ãã§ãããµãã¯ã©ã¹ã«ã¯ç¶æ¿ãããªãããããããã¿ã¤ãç¶æ¿ã¢ãã«ã«ã¯ããã¾ãããã¯ã©ã¹ãç°ãªãã¨ããã©ã¤ãã¼ãè¦ç´ ã¯åãååã§ãå
¨ãç°ãªããã®ã§ãããç¸äºéç¨ã¯ã§ãã¾ãããã¯ã©ã¹ãã¨ã«ç®¡çããããã¤ã³ã¹ã¿ã³ã¹ã«ä»å ãããå¤é¨ã¡ã¿ãã¼ã¿ã¨ãã¦èãã¦ãã ããããã®ããã structuredClone()
ã¯ãã©ã¤ãã¼ãè¦ç´ ãè¤è£½ããã Object.freeze()
ã Object.seal()
ã¯ããã©ã¤ãã¼ãè¦ç´ ã«ã¯å½±é¿ãã¾ããã
ãã©ã¤ãã¼ããã£ã¼ã«ãããã¤ãã©ã®ããã«åæåããããã«ã¤ãã¦ã®è©³ç´°ã¯ããã©ã¤ãã¼ãã¯ã©ã¹ãã£ã¼ã«ããåç §ãã¦ãã ããã
ä¾ ãã©ã¤ãã¼ããã£ã¼ã«ããã©ã¤ãã¼ããã£ã¼ã«ãã«ã¯ããã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ãã¨ãã©ã¤ãã¼ãéçãã£ã¼ã«ããããã¾ãããã©ã¤ãã¼ããã£ã¼ã«ãã¯ãã¯ã©ã¹å®£è¨ã®å é¨ããã®ã¿ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ãã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ããã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ãã¯ããããªãã¯çã¨æ¬¡ã®ç¹ã§ä¼¼ã¦ãã¾ãã
super()
ãå¼ã³åºããç´å¾ã«è¿½å ããã¾ããclass ClassWithPrivateField {
#privateField;
constructor() {
this.#privateField = 42;
}
}
class Subclass extends ClassWithPrivateField {
#subPrivateField;
constructor() {
super();
this.#subPrivateField = 23;
}
}
new Subclass(); // éçºè
ãã¼ã«ã§ã¯ Subclass {#privateField: 42, #subPrivateField: 23} ã¨è¡¨ç¤º
ã¡ã¢: åºåºã¯ã©ã¹ ClassWithPrivateField
ã® #privateField
㯠ClassWithPrivateField
ã®ãã©ã¤ãã¼ãã¡ã³ãã¼ã§ãããæ´¾çã¯ã©ã¹ Subclass
ããã¯ã¢ã¯ã»ã¹ã§ãã¾ããã
ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ç°ãªããªãã¸ã§ã¯ããè¿ããã¨ãã§ãããã®ãªãã¸ã§ã¯ãã¯æ´¾çã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã®æ°ãã this
ã¨ãã¦ä½¿ç¨ãããã¨ãã§ãã¾ããæ´¾çã¯ã©ã¹ã¯ãè¿ããããªãã¸ã§ã¯ãã«ããã¦ãã©ã¤ãã¼ããã£ã¼ã«ããå®ç¾©ãããã¨ãã§ãã¾ããã¤ã¾ããç¡é¢ä¿ãªãªãã¸ã§ã¯ãã«ãã©ã¤ãã¼ããã£ã¼ã«ãããå»å°ããããã¨ãå¯è½ã§ãã
class Stamper extends class {
// ã³ã³ã¹ãã©ã¯ã¿ã¼ãæå®ããããªãã¸ã§ã¯ããè¿ãåºåºã¯ã©ã¹
constructor(obj) {
return obj;
}
} {
// ãã®å®£è¨ã¯ãåºåºã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãè¿ããªãã¸ã§ã¯ãã«
// ãã©ã¤ãã¼ããã£ã¼ã«ãããå»å°ããã
#stamp = 42;
static getStamp(obj) {
return obj.#stamp;
}
}
const obj = {};
new Stamper(obj);
// `Stamper` 㯠`Base` ãå¼ã³åºã㦠`obj` ãè¿ããæ¬¡ã«
// `Stamper` 㯠`obj` ã« `#stamp` ãå®ç¾©ãã
console.log(obj); // ä¸é¨ã®éçºè
ãã¼ã«ã§ã¯ {#stamp: 42} ã¨è¡¨ç¤º
console.log(Stamper.getStamp(obj)); // 42
console.log(obj instanceof Stamper); // false
// ãã©ã¤ãã¼ãè¦ç´ ã« 2 度å»å°ãããã¨ã¯ã§ãã¾ããã
new Stamper(obj); // Error: Initializing an object twice is an error with private fields
è¦å: ããã¯ã¨ã¦ãæ··ä¹±ãæããããªããã¨ã§ããä¸è¬çã«ãã³ã³ã¹ãã©ã¯ã¿ã¼ããä»»æã®ãã®ãè¿ãã®ã¯é¿ããããã«ãã¾ããããç¹ã« this
ã«é¢ä¿ã®ãªããã®ãè¿ãã®ã¯é¿ããããã«ãã¾ãããã
ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã¯ããããªãã¯çã¨æ¬¡ã®ç¹ã§ä¼¼ã¦ãã¾ãã
class ClassWithPrivateStaticField {
static #privateStaticField = 42;
static publicStaticMethod() {
return ClassWithPrivateStaticField.#privateStaticField;
}
}
console.log(ClassWithPrivateStaticField.publicStaticMethod()); // 42
ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã«ã¯å¶éãããã¾ãããã©ã¤ãã¼ãéçãã£ã¼ã«ããå®ç¾©ããã¯ã©ã¹ã®ã¿ãããã®ãã£ã¼ã«ãã«ã¢ã¯ã»ã¹ã§ãã¾ãã this
ã使ç¨ããã¨ãäºæããªãåä½ãããå¯è½æ§ãããã¾ããæ¬¡ã®ä¾ã§ã¯ã SubClass.basePublicStaticMethod()
ãå¼ã³åºããã¨ããã¨ãã« this
ã Subclass
ã¯ã©ã¹ãï¼BaseClassWithPrivateStaticField
ã¯ã©ã¹ã§ã¯ãªãï¼åç
§ãã¦ãã¾ãã TypeError
ãçºçãã¾ãã
class ClassWithPrivateStaticField {
static #privateStaticField = 42;
static publicStaticMethod() {
return this.#privateStaticField;
}
}
class Subclass extends ClassWithPrivateStaticField {}
Subclass.publicStaticMethod(); // TypeError: Cannot read private member #privateStaticField from an object whose class did not declare it
ããã¯ããã®ã¡ã½ããã« super
ãä»ãã¦å¼ã³åºãã®ã¨åãã§ãã super
ã®ã¡ã½ããã¯ã¹ã¼ãã¼ã¯ã©ã¹ã this
ã¨ãã¦å¼ã³åºãããã§ã¯ãªãããã§ãã
class ClassWithPrivateStaticField {
static #privateStaticField = 42;
static publicStaticMethod() {
// super ãå¼ã³åºãã¦ãã `this` 㯠Subclass ãåç
§ãã¦ãã
return this.#privateStaticField;
}
}
class Subclass extends ClassWithPrivateStaticField {
static callSuperMethod() {
return super.publicStaticMethod();
}
}
Subclass.callSuperMethod(); // TypeError: Cannot read private member #privateStaticField from an object whose class did not declare it
ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã«ã¯å¸¸ã« this
ã§ã¯ãªããã¯ã©ã¹åã§ã¢ã¯ã»ã¹ããããã«ãã¦ãã ããã
ãã©ã¤ãã¼ãã¡ã½ããã«ã¯ããã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã¨ãã©ã¤ãã¼ãéçã¡ã½ãããããã¾ãããã©ã¤ãã¼ãã¡ã½ããã¯ãã¯ã©ã¹å®£è¨ã®å é¨ããã®ã¿ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
ãã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãããã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã¯ããããªãã¯çã¨æ¬¡ã®ç¹ã§ç°ãªãã¾ãã
.prototype
ããããã£ã§ã¯å©ç¨ã§ãã¾ãããclass ClassWithPrivateMethod {
#privateMethod() {
return 42;
}
publicMethod() {
return this.#privateMethod();
}
}
const instance = new ClassWithPrivateMethod();
console.log(instance.publicMethod()); // 42
ãã©ã¤ãã¼ãã¤ã³ã¹ã¿ã³ã¹ã¡ã½ããã¯ãã¸ã§ãã¬ã¼ã¿ã¼ãéåæãéåæã¸ã§ãã¬ã¼ã¿ã¼ã®é¢æ°ã«ãããã¨ãã§ãã¾ãããã©ã¤ãã¼ãã²ãã¿ã¼ã¨ã»ãã¿ã¼ãå¯è½ã§ããããªãã¯ã®ã²ãã¿ã¼ã¨ã»ãã¿ã¼ã¨åãæ§æã«å¾ãã¾ãã
class ClassWithPrivateAccessor {
#message;
get #decoratedMessage() {
return `ð¬${this.#message}ð`;
}
set #decoratedMessage(msg) {
this.#message = msg;
}
constructor() {
this.#decoratedMessage = "hello world";
console.log(this.#decoratedMessage);
}
}
new ClassWithPrivateAccessor(); // ð¬hello worldð
ãããªãã¯ã¡ã½ããã¨ç°ãªãããã©ã¤ãã¼ãã¡ã½ããã¯ã¯ã©ã¹ã® .prototype
ããããã£ããã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã
class C {
#method() {}
static getMethod(x) {
return x.#method;
}
}
console.log(C.getMethod(new C())); // [Function: #method]
console.log(C.getMethod(C.prototype)); // TypeError: Receiver must be an instance of class C
ãã©ã¤ãã¼ãéçã¡ã½ãã
ãã©ã¤ãã¼ãéçã¡ã½ããã¯ããããªãã¯çã¨æ¬¡ã®ç¹ã§ä¼¼ã¦ãã¾ãã
class ClassWithPrivateStaticMethod {
static #privateStaticMethod() {
return 42;
}
static publicStaticMethod() {
return ClassWithPrivateStaticMethod.#privateStaticMethod();
}
}
console.log(ClassWithPrivateStaticMethod.publicStaticMethod()); // 42
ãã©ã¤ãã¼ãéçã¡ã½ããã¯ãã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ãéåæé¢æ°ãéåæã¸ã§ãã¬ã¼ã¿ã¼é¢æ°ããªã©ãããã¾ãã
åè¿°ã®ãã©ã¤ãã¼ãéçãã£ã¼ã«ãã®å¶éã¯ããã©ã¤ãã¼ãéçã¡ã½ããã«ãå½ã¦ã¯ã¾ããthis
ãåæ§ã«ä½¿ç¨ããã¨äºæããªãåä½ãçºçããå¯è½æ§ãããã¾ããæ¬¡ã®ä¾ã§ã¯ã Derived.publicStaticMethod2()
ãå¼ã³åºããã¨ããã¨ããã㯠Base
ã¯ã©ã¹ã§ã¯ãªã Derived
ã¯ã©ã¹ãåç
§ãããããTypeError
ãçºçãã¾ãã
class ClassWithPrivateStaticMethod {
static #privateStaticMethod() {
return 42;
}
static publicStaticMethod() {
return this.#privateStaticMethod();
}
}
class Subclass extends ClassWithPrivateStaticMethod {}
console.log(Subclass.publicStaticMethod()); // TypeError: Cannot read private member #privateStaticMethod from an object whose class did not declare it
ãã©ã¤ãã¼ãã³ã³ã¹ãã©ã¯ã¿ã¼ãã·ãã¥ã¬ã¼ã·ã§ã³
ä»ã®å¤ãã®è¨èªã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ããã©ã¤ãã¼ãã¨ãã¦æå®ããæ©è½ããããã¯ã©ã¹èªèº«ã®å¤é¨ã§ã¤ã³ã¹ã¿ã³ã¹ã使ã§ããªãããã«ãããã¨ãã§ãã¾ãã JavaScript ã«ã¯ãããè¡ããã¤ãã£ããªæ¹æ³ã¯ããã¾ãããããã©ã¤ãã¼ãéçãã©ã°ã使ç¨ãããã¨ã§å®ç¾ã§ãã¾ãã
class PrivateConstructor {
static #isInternalConstructing = false;
constructor() {
if (!PrivateConstructor.#isInternalConstructing) {
throw new TypeError("PrivateConstructor ã¯æ§ç¯ã§ãã¾ãã");
}
PrivateConstructor.#isInternalConstructing = false;
// More initialization logic
}
static create() {
PrivateConstructor.#isInternalConstructing = true;
const instance = new PrivateConstructor();
return instance;
}
}
new PrivateConstructor(); // TypeError: PrivateConstructor ã¯æ§ç¯ã§ãã¾ãã
PrivateConstructor.create(); // PrivateConstructor {}
仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§ javascript.classes.private_class_fields javascript.classes.private_class_fields_in javascript.classes.private_class_methods é¢é£æ
å ±
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4