How to implement the private property write class mode of of 2 in JavaScript


Last time I wrote a tool function $class, this time I improved the following. Implement the following functions

1, inheritance

2. When subclasses inherit the parent class, they do not inherit the private properties of the parent class

/**
 * @param {String} className
 * @param {String/Function} superCls
 * @param {Function} classImp
 */
function $class(className, superCls, classImp){
    if(superCls === '') superCls = Object;
    function clazz(){
        if(typeof this.init == "function"){
            this.init.apply(this, arguments);
        }
    }
    var p = clazz.prototype = new superCls();
    var _super = superCls.prototype;
    window[className] = clazz;
    classImp.apply(p, [_super]);
}

So let’s write a parent class

$class('Person','',function(){
    //Private property age
    var age;
    this.init = function(n, a){
        //Public property name
        this.name = n;
        //Private property initialization
        age = a;
    };
    this.getName = function(){
        return this.name;
    };
    this.setName = function(name){
        this.name = name;
    }
    this.getAge = function(){
        return age;
    };
    this.setAge = function(a){
        age = a;
    };
});

Write subclasses that inherit from Person

$class("Man",Person, function(supr){
    var school;
    this.init = function(n, a, s){
        supr.init.apply(this, [n,a]);
        school = s;
    }
    this.getSchool = function(){
        return school;
    };
    this.setSchool = function(s){
        school = s;
    };
});

A subclass instance of new

var m = new Man('tom', 25, 'pku');
console.log(m.name); //The name of the common property Tom inherits from the parent class can be obtained directly using the point operator
console.log(m.age);  //The private property age of an undefined parent class cannot be obtained directly using the point operator
console.log(m.getAge()); //25 the private property age can be obtained through the parent class's common method, getAge
console.log(m.school); //Undefined Man's own private properties are still not available through the point operator
console.log(m.getSchool()); //Pku gets the private attribute school through the getSchool () method