JavaScriptに深く入り込む(4)-new演算子はどのように働きますか?
2389 ワード
上編(//www.cnblogs.com/patrick-holynova/archive/2013/05/14/3077295.html)に続き、OOPで重要なnew演算についてお話しします。
JavaScriptは上級言語C++やJavaなどのように、クラスに対するサポートを提供していません。Jsでは、クラス、クラスの実例をどのように実現しますか?対象字面量 コンストラクタで作成 対象文字数、例:
コンストラクタとは何ですか前の何回も言ったことがあります。また、その構造関数を呼んでもいいです。
prototypeの属性は、この属性が指すオブジェクトで、インスタンスを初期化するために使用されます。proto_つまり、新しい実例たちはこの対象を引き継いでいます。
もちろん、一つのコンストラクタには多くの内部方法が必要です。
構造関数はnew表現によって新しいオブジェクトを作成する必要があります。newを使わないと、結果は具体的な構造関数の書き方に依存します。
たとえば:
new演算はどうやって働きますか?
まず、このような構造関数があると仮定します。
newの実行過程新たなオブジェクトを作成します。obj=new Object() WOW Charcterアーキテクチャ関数を呼び出す:着信パラメータ(あるなら)、本例では(「巫猫王」)であり、構築関数のthisを新たなオブジェクトobj コンストラクタが一つのオブジェクトに戻ったら、最終的な新しい例はこのオブジェクト(この例では、コンストラクタは戻り値がなく、通常は戻り値がない。)コンストラクタが一つのオブジェクトに戻らない場合、第1ステップで作成したオブジェクトobjを最終的な戻り値とする。subsidiaryCharcter=obj.4591678・
--over--
new演算は雑談し終わって、上で私有変数の問題に言及して、levelは1つの私有の変数で、“特権の関数”get Levelを通すことしかできなくて、set Levelは訪問します。
直接subsidiary Charcter.levelは値が取れないです。なぜですか?包みを閉じる
今度はJsの中のクローズドについて話しましょう。
JavaScriptは上級言語C++やJavaなどのように、クラスに対するサポートを提供していません。Jsでは、クラス、クラスの実例をどのように実現しますか?
Detail = {
'game': 'World of Warcraft',
'class': 'Priest',
'spell': 'Holy Nova'
}
このような方法は何も言いにくいです。重点的にコンストラクタを通して実例を作ります。コンストラクタとは何ですか前の何回も言ったことがあります。また、その構造関数を呼んでもいいです。
prototypeの属性は、この属性が指すオブジェクトで、インスタンスを初期化するために使用されます。proto_つまり、新しい実例たちはこの対象を引き継いでいます。
もちろん、一つのコンストラクタには多くの内部方法が必要です。
構造関数はnew表現によって新しいオブジェクトを作成する必要があります。newを使わないと、結果は具体的な構造関数の書き方に依存します。
たとえば:
d1 = Date(); // "Mon May 20 2013 10:10:38 GMT+0800 (China Standard Time)"
// typeof d1 == 'string' , , ' '.
d2 = new Date(); // typeof d2 == 'object' , d2
各構造関数によって作成されたオブジェクトは、構造関数のプロトタイプオブジェクトに陰的に参照されます。d2.__proto__ === Date.prototype; // true
Object.getPrototypeOf(d) === Date.prototype; // true
------------ new演算はどうやって働きますか?
まず、このような構造関数があると仮定します。
var WOWCharacter = function(cName) {
var level = 0;
this.name = cName;
this.getLevel = function() { return this. level; }
this.setLevel = function(lv) { this.level = lv; return this.getLevel(); }
}
キャラクターを作成して、クラスのインスタンスを作成します。var subsidiaryCharacter = new WOWCharacter(' ');
// subsidiaryCharater
{
name: ' ',
getLevel: function(){...},
setLevel: function(){...}
}
ちょっとお聞きしたいのですが、level属性はどこにありますか?実はこれは「私有変数」です。直接訪問することはできません。これは文章の最後に紹介するポイントで、本編の重点ではありません。newの実行過程
--over--
new演算は雑談し終わって、上で私有変数の問題に言及して、levelは1つの私有の変数で、“特権の関数”get Levelを通すことしかできなくて、set Levelは訪問します。
直接subsidiary Charcter.levelは値が取れないです。なぜですか?包みを閉じる
今度はJsの中のクローズドについて話しましょう。