ホームページ >ウェブフロントエンド >jsチュートリアル >javascript_js オブジェクト指向でクラスを記述する 4 番目の方法

javascript_js オブジェクト指向でクラスを記述する 4 番目の方法

WBOY
WBOYオリジナル
2016-05-16 18:50:47881ブラウズ

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;
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。