4. コンストラクターとプロトタイプはクラスを直接アセンブルします。同じコンストラクターは同じ型をアセンブルします。
これまでの記事から、JavaScript でクラスを記述することは単なるコンストラクターとプロトタイプにすぎないことがわかりました。この場合、クラスを作成するためのツール関数を作成します。
/**
* $class はクラス記述ツール関数の 1 つです
* @param {Object} コンストラクター
* @param {Object} プロトタイプ
*/
function $class(constructor,prototype) {
var c = コンストラクター || function(){};
c.prototype = p; return c;
}
うーん。ツール クラスが記述されたので、それを組み立ててみましょう。コンストラクターを使用してクラス インスタンスの属性 (フィールド) を生成し、プロトタイプ オブジェクトを使用してクラス インスタンスのメソッドを生成します。
//Constructor
function Person( name) {
this.name = name;
}
//プロトタイプ オブジェクト
var proto = {
getName : function(){return this.name},
setName : function( name){this.name = name;}
}
//Assembly
var Man = $class(person,proto)
var Woman = $class(person, proto) ;
わかりました。これで、男性と女性の 2 つのクラスが得られました。しかも同じタイプですよ。テストは次のとおりです:
console.log (Man == Woman) ;//true
console.log(Man.prototype == Woman.prototype);//true
オブジェクトを作成して確認してください。
var man = new Man("Andy")
var women = new Woman("Lily") ;
console.log(man インスタンスオブマン);//true
console.log(女性インスタンスof Woman);//true
console.log(マン インスタンスオブ) Person);//true
console .log(女性インスタンスオブ パーソン);//true
OK、すべて予想通りです。しかし、次のコードの結果は false を出力します。
コードをコピーします。 コードは次のとおりです。 > console.log(man.constructor == Person);//false
これは不快です。上記のコードから、人間は実際にMan クラス new var man = new Man ("Andy") の場合、オブジェクト インスタンス man のコンストラクターは Man を指すはずですが、なぜそれが裏目に出てしまうのでしょうか?
その理由は、Person のプロトタイプが $class で書き換えられるためです: c.prototype = p;
OK、$class を少し書き換えて、コンストラクターのプロトタイプにすべてのメソッドをハングさせましょう (書き換える代わりに)
コードをコピー
コードは次のとおりです: function $class (constructor,prototype) {
var c = function(){};
// c.prototype = p; for(var atr in p)
c.prototype[atr] = p[atr];
return c;