JavaScript模拟类Java面向对象编程

一个标准的类java的JavaScript类

/*
 * 模拟面向对象的标准JavaScript类
 *
 * 类属性
 * 类方法
 * 实例属性
 * 实例方法
 *
 */
//构造函数
function Person(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
}

//实例方法
Person.prototype.speak = function (content) {
    console.log(this.name + "正在说:" + content);
}

Person.prototype.toString = function () {
    //返回属性组成的json串
    return '{name:' + this.name + ',age:' + this.age + ',sex:' + this.sex + '}';
}


//类字段       ~=java中静态属性  public static
Person.GOODMAN = new Person('good man', 100, 'male');
Person.MAN = new Person('man', 22, 'male');
Person.WOMAN = new Person('woman', 18, 'female');

//类方法       ~=java中的静态方法 public static
/**
 *
 * @param {String} personString person实例的json串
 */
Person.parse = function (personString) {
    //判断是否时json串
    if (!personString.match(Person._jsonReg)) {
        throw new TypeError('请传入一个json串');
    }
    var p = JSON.parse(personString);
    //让新创建的对象编程Person类实例
    p = new Person(p.name, p.age, p.sex);
    console.log(">>Json parse得到的person实例:");
    console.log(p);
    return p;
}

//类的私有字段(仅通过'_'标识以下, 并不是真的不可见)        private static
Person._jsonReg = /^\{([^,]+:[^,]+,*)+\}$/;

测试:

    
    

new Person()JSON.parse(personString)得到的实例区别

image.png

由图可见, JSON.parse(personString)得到的实例时键:值形式, 原型指向Object, i.e.这样并不是得到Person类实例

因此, 目前的Person.parse()方法并不合理, 合理的应该是返回Person类实例.

Person.parse = function (personString) {
    //判断是否时json串
    if (!personString.match(Person._jsonReg)) {
        throw new TypeError('请传入一个json串');
    }
    var p = JSON.parse(personString);
    console.log(">>Json parse得到的person实例:");
    console.log(p);
    return p;
}

改为:

Person.parse = function (personString) {
    //判断是否时json串
    if (!personString.match(Person._jsonReg)) {
        throw new TypeError('请传入一个json串');
    }
    var p = JSON.parse(personString);
    //让新创建的对象编程Person类实例
    p = new Person(p.name, p.age, p.sex);
    console.log(">>Json parse得到的person实例:");
    console.log(p);
    return p;
}

你可能感兴趣的:(JavaScript模拟类Java面向对象编程)