上一篇寫了個(gè)工具函數(shù)$class,這篇再完善以下。實(shí)現(xiàn)以下功能
1,繼承
2,子類繼承父類時(shí),不繼承父類的私有屬性
復(fù)制代碼 代碼如下:
/** 
 * @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]); 
}
復(fù)制代碼 代碼如下:
/** 
 * 父類 Person 
 */
$class('Person','',function(){ 
    // 私有屬性age 
    var age; 
    this.init = function(n, a){ 
        // 公有屬性name 
        this.name = n; 
        // 私有屬性初始化 
        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; 
    }; 
});
復(fù)制代碼 代碼如下:
$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; 
    }; 
}); 
復(fù)制代碼 代碼如下:
var m = new Man('tom', 25, 'pku'); 
console.log(m.name); // tom 繼承父類的共有屬性name可以直接使用點(diǎn)操作符獲取 
console.log(m.age);  // undefined 父類的私有屬性age不能直接使用點(diǎn)操作符獲取 
console.log(m.getAge()); // 25 可通過(guò)父類的共有方法getAge獲取私有屬性age 
console.log(m.school); // undefined Man自己的私有屬性仍然不能通過(guò)點(diǎn)操作符獲取 
console.log(m.getSchool()); // pku 通過(guò)getSchool()方法獲取私有屬性school 
 
  | 
新聞熱點(diǎn)
疑難解答
圖片精選