chrome 74;node 12 新增了 js 类私有域,包括私有变量,私有函数
class Mtest {
#privateField;
#privateMethod() {
return 'privateMethod';
}
publicMethod() {
console.log(this.#privateField)
return this.#privateMethod();
}
static #privateStaticMethod() {
return 'call privateStaticMethod';
}
static #PRIVATE_STATIC_FIELD;
// #constructor > Class constructor may not be a private method
constructor() {
console.log(Object.keys(this)) // []
this.#privateField = "privateField"
console.log("privateField:", this["#privateField"])
}
static publicStaticMethod() {
Mtest.#PRIVATE_STATIC_FIELD = 42;
return Mtest.#PRIVATE_STATIC_FIELD;
}
static publicStaticMethod1() {
// 继承后 publicStaticMethod2 中的 this 指向子类 ; 故此不能用this
return Mtest.#privateStaticMethod();
}
static publicStaticMethod2() {
// 继承后 publicStaticMethod2 中的 this 指向子类 ; 故此不能用this
return this.#privateStaticMethod();
}
}
class SubClass extends Mtest {
#subPrivateField;
constructor() {
super();
// console.log(super.#privateMethod()) Unexpected private field
this.#subPrivateField = 23;
// this.#privateField > Private field '#privateField' must be declared in an enclosing class
}
}
var m = new Mtest()
m.publicMethod();
Object.getOwnPropertyDescriptors(m) // {}
console.log(Mtest.publicStaticMethod())
var clone = {};
Object.assign(clone, m)
Object.setPrototypeOf(clone, Mtest.prototype)
// console.log(clone.publicMethod())
// Cannot read private member #privateField from an object whose class did not declare it
console.log(SubClass.publicStaticMethod1()); // 42
// console.log(SubClass.publicStaticMethod2());
// Cannot read private member #privateStaticMethod from an object whose class did not declare it
输出 :
js 私有属性
2021-10-12 20:26·墨灵科普
chrome 74;node 12 新增了 js 类私有域,包括私有变量,私有函数
class Mtest {
#privateField;
#privateMethod() {
return 'privateMethod';
}
publicMethod() {
console.log(this.#privateField)
return this.#privateMethod();
}
static #privateStaticMethod() {
return 'call privateStaticMethod';
}
static #PRIVATE_STATIC_FIELD;
// #constructor > Class constructor may not be a private method
constructor() {
console.log(Object.keys(this)) // []
this.#privateField = "privateField"
console.log("privateField:", this["#privateField"])
}
static publicStaticMethod() {
Mtest.#PRIVATE_STATIC_FIELD = 42;
return Mtest.#PRIVATE_STATIC_FIELD;
}
static publicStaticMethod1() {
// 继承后 publicStaticMethod2 中的 this 指向子类 ; 故此不能用this
return Mtest.#privateStaticMethod();
}
static publicStaticMethod2() {
// 继承后 publicStaticMethod2 中的 this 指向子类 ; 故此不能用this
return this.#privateStaticMethod();
}
}
class SubClass extends Mtest {
#subPrivateField;
constructor() {
super();
// console.log(super.#privateMethod()) Unexpected private field
this.#subPrivateField = 23;
// this.#privateField > Private field '#privateField' must be declared in an enclosing class
}
}
var m = new Mtest()
m.publicMethod();
Object.getOwnPropertyDescriptors(m) // {}
console.log(Mtest.publicStaticMethod())
var clone = {};
Object.assign(clone, m)
Object.setPrototypeOf(clone, Mtest.prototype)
// console.log(clone.publicMethod())
// Cannot read private member #privateField from an object whose class did not declare it
console.log(SubClass.publicStaticMethod1()); // 42
// console.log(SubClass.publicStaticMethod2());
// Cannot read private member #privateStaticMethod from an object whose class did not declare it
输出
` []
privateField: undefined
privateField
42
call privateStaticMethod
`