1) Javascript オブジェクト メンバーの実験:
var f = function d () {
this.a = "a";/*この文を実行すると、f.a も d.a もありません。window.a があります*/
var b = "b";/*ローカル変数*/
};
var o = { ff: function () {
var a = "a"; /*ローカル変数*/
this.b = "b"; *この文は o.b*/
}
} の後に実行されます。
function Man(){
this.age = 30;
Man.prototype.sex = 1 ;
Man.prototype.name = function () {
};/*最初のブレークポイント*/
o.ff(); m = new Man(); /*2 番目のブレークポイント*/
最初のブレークポイントでのオブジェクト メンバーの存在:
2 番目のブレークポイントでのオブジェクト メンバーの存在:
![](http://files.jb51.net/upload/201011/20101119222740812.png)
一文: js 関数について: これは関数の外側の最も近いレベルのオブジェクトを指しますが、ネストされた関数の内部関数内の this はウィンドウ オブジェクトを指します。
一言で言えば: js の oo 機能: オブジェクトのメンバーを定義するためにこれを使用します。オブジェクトの使用には、クラスとオブジェクト インスタンス、および .prototype の違いがあります。定義は古典的な定義方法であり、クラスとオブジェクトのインスタンスが統合されています。 ![](http://files.jb51.net/upload/201011/20101119222744223.png)
2) Javascript オブジェクトの共有メンバー変数の実験:
コードをコピー
}
Ghost.prototype.setName = function (_name) {
this.name = _name;
}
function Man(_name){
this.age = 30;
this.ghost = new Ghost("インスタンス変数" _name); 🎜> };
Man.prototype.ManGhost = new Ghost("共有変数");
var a = new Man("a");
var amg = a.ManGhost.setName("a の共有変数を設定するだけです");
debugger; /*最初のブレークポイント*/
var ag = a.ghost; = b.ghost;
var bmg = b.ManGhost; /*2 番目のブレークポイント */
最初のブレークポイントまで実行します:
単純変数とオブジェクト変数の違い
.prototype で定義されたメンバーを使用します。メンバーが単純な変数の場合、各オブジェクト インスタンスには独自のコピーがあります。 (例: Man.prototype.noObejctVar)
.prototype で定義されたメンバーを使用します。メンバーがオブジェクト変数の場合、各オブジェクト インスタンスはオブジェクトの同じコピーを共有します。 (例: Man.prototype.ManGhost)
なぜこのような違いがあるのでしょうか? ManGhost 変数と noObjectVar 変数には違いはありません。どちらも .prototype を使用して定義されたメンバーです。つまり、それらのアクセス方法と使用方法が異なるだけです。 ManGhost 変数には新しいオブジェクトが格納され、noObjectVar 変数には値 (または特定の値への参照) が格納されます。つまり、ManGhost はオブジェクトへの参照を格納します。参照、および noObjectVar 変数 メモリ ストレージも、ある種の値参照である可能性がありますが、この参照を操作に使用することはできません。
別の視点から見る
noObjectVar 変数は文字列オブジェクトへの参照を保存します。
a.noObjectVar="新しい文字列 a";
これは、noObjectVar が元の文字列オブジェクト参照から新しい文字列オブジェクト参照を指すことを意味します (新しい文字列オブジェクトが元の文字列オブジェクトを上書きするとも言えます)
a.ManGhost=new Ghost("a");
b.ManGhost=new Ghost("b");
このように、a と b の間でオブジェクトを共有することは問題ありませんが、prototype.ManGhost を作成するときに新しいオブジェクトを定義するのは間違っています。このように
.prototype を使用してメンバー関数と共有変数を定義するのが正しい使用法です。
JavaScript を使用してクラスを正しく定義するには、以下を参照してください: [技術メモ] クラス仕様を定義するための JavaScript