前回の記事では$classというツール関数を書きましたが、今回の記事ではそれを以下のように改良していきます。以下の機能を実装します
1. 継承
2. サブクラスが親クラスを継承する場合、親クラスのプライベート属性は継承しません。
次のようにコードをコピーします。
/**
* @param {文字列} クラス名
* @param {文字列/関数} superCls
* @param {関数} classImp
*/
関数 $class(className, superCls, classImp){
if(superCls === '') superCls = オブジェクト;
functionclazz(){
if(this.init のタイプ == "関数"){
this.init.apply(this, 引数);
}
}
var p = clazz.prototype = 新しい superCls();
var _super = superCls.prototype;
ウィンドウ[クラス名] = clazz;
classImp.apply(p, [_super]);
}
まず親クラスを作成します
次のようにコードをコピーします。
/**
* 親クラスの人
*/
$class('人','',function(){
//プライベート属性の年齢
可変年齢。
this.init = function(n, a){
//パブリック属性名
this.name = n;
// プライベートプロパティの初期化
年齢 = a;
};
this.getName = function(){
this.name を返します。
};
this.setName = 関数(名前){
this.name = 名前;
}
this.getAge = function(){
年齢を返す。
};
this.setAge = function(a){
年齢 = a;
};
});
サブクラスを作成し、Person から継承します
次のようにコードをコピーします。
$class("男",人物, function(supr){
varスクール。
this.init = function(n, a, s){
supr.init.apply(this, [n,a]);
学校 = s;
}
this.getSchool = function(){
学校に戻る。
};
this.setSchool = 関数{
学校 = s;
};
});
新しいサブクラスインスタンス
次のようにコードをコピーします。
var m = new Man('tom', 25, 'pku');
console.log(m.name); // Tom は親クラスの共通属性名を継承し、ドット演算子を直接使用してそれを取得できます。
console.log(m.age); // 未定義 親クラスのプライベート プロパティ age は、ドット演算子を使用して直接取得できません。
console.log(m.getAge()); // 25 プライベート属性 age は、親クラスの public メソッド getAge を通じて取得できます。
console.log(m.school); // 未定義の Man 自身のプライベート プロパティは依然としてドット演算子を介して取得できません
console.log(m.getSchool()); // pku は getSchool() メソッドを通じてプライベート属性 school を取得します。