js 私有属性

2 篇文章 0 订阅
1 篇文章 0 订阅

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

`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值