私のjavascript学習の道(二)対象の定義


もっと読む
javascriptは弱い言語です.
私たちはjavascriptを勉強する時、強いタイプの言語規則の制限が強いタイプの言語を受け取るべきではないです.データ構造(クラス)から対象(クラスの実例)までの2つの角度から問題を考えるので、動的な増加類の属性や方法を実現するのは難しいです.一つのオブジェクトを生成するときに、動的に属性や方法を増やすのも難しいです.一般的には装飾モードが必要です.一番基本的な動的に実体beanを生成して、データmapからkey対応の値をbeanに付与するこのname属性は全部オーバーヘッドが大きいことです.しかし、javascriptは全く違っています.javascriptを勉強する時にjavaなどの概念を忘れて、javascriptの中にはオブジェクトしかないことを知る必要があります.
//一、工場方式
//第二の例p 2とpersonは同じオブジェクトを指すことが見られます.「クラスの機能」は実現できません.オブジェクトだけです.

var person = new Object();
person.name="sjf";
person.age=24;
person.showName=function(){alert(this.name);}
person.showName();//sjf
var p2 = person ;
p2.name='jianfeng';
p2.showName();//jianfeng
person.showName();//jianfeng
もちろん私達はこのように処理できます.
var p 2=new Object()
for(var p in  person{
   p 2[p]=person[p]
)
//このようなことはjavaでどうやって実現しますか?だからjsを勉強する時はjavaを忘れましょう.
//二、工場モード
短所:
1、newは使用していません.
2、showNameは中に入れるのがもったいないので、外に置いて包装するのはよくないです.

function createPerson(name,age){	
	var person = new Object();
	person.name=name;
	//alert(this.name);
	person.age=age;
	person.showName=function (){alert(this.name);};
	return person;
}

var p1 = createPerson('sjf',24);
p1.showName();//sjf
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = createPerson('jianfeng',42);
p2.showName();//jianfeng

p1.showName();//sjf
//下記のコードを比較してください.

function createPerson(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;
	this.showName=function (){alert(this.name);};
	return this;
}


var p1 = createPerson('sjf',24);
p1.showName();//sjf

/*
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}
*/
var p2 = createPerson('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//jianfeng

/*
この方法から私達はthisを使います.
ここのthisはずっとwindowオブジェクトのすべてのp 1を指しています.第二回ショーNameの時に最新のものになりました.このようにして毎回新しく生成したwindowオブジェクトをp 1とp 2に与えました.これは明らかに私達が必要ではないです.解決方法は:

var p1 = new  createPerson('sjf',24);
var p2 = new   createPerson('jianfeng',42);
は、オブジェクトを定義し、この関数を彼に与え(ここでは、thisポインタの使い方を分かりやすくするために!)、その後、オブジェクトの関数を呼び出します.前の文章の中でもう話しました.

var p1 = new  Object();
p1.createPerson = createPerson;
p1.createPerson('sjf',24);

var p2 = new  Object();
p2.createPerson=createPerson;
p2.createPerson('jianfeng',42);
*/
//三、コンストラクタ方式
短所:
1、newは使用していません.
2、showNameは中に入れるのがもったいないので、外に置いて包装するのはよくないです.

function createPerson(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;
	this.showName=function (){alert(this.name);};
	return this;
}


var p1 = new createPerson('sjf',24);

p1.showName();//sjf

/*
for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}
*/
var p2 = createPerson('jianfeng',42);

p2.showName();//jianfeng
p1.showName();//sjf
//四構造関数/プロトタイプ
短所:
1、newは使用していません.(解決)
2、showNameは中に入れるのがもったいないので、外に置いて包装するのはよくないです.

function Person(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;	
	return this;

}

Person.prototype.showName=function (){
	alert(this.name);
}


var p1 = new Person('sjf',24);

p1.showName();//sjf


for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = new Person('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//sjf
//五、ダイナミックプロトタイプの方法
短所:
1、newは使用していません.(解決)
2、showNameは中に入れるのがもったいないので、外に出して包装するのはよくないです.

function Person(name,age){	

	this.name=name;
	//alert(this.name);
	this.age=age;	
	//return this;
	if(typeof Person._initialized=='undefined'){
	
		Person.prototype.showName=function (){
			alert(this.name);
		}
		Person._initialized=true;
	}

}



var p1 = new Person('sjf',24);

p1.showName();//sjf


for(var p in p1 ){
alert('key:'+ p + '==>value : ' + p1[p] );
}

var p2 = new Person('jianfeng',42);
p2.showName();//jianfeng
p1.showName();//sjf
ここを見ると、冒頭には属性コピーの定義方法があるということですか?  はい、しかし、具体的な対象に対しては、たまにこのように使ってもいいですが、これは個人に対する操作だけです.例えば、javaで実体beanをデータMapで充填するように、ここで議論しているのは、より広い意味でのクラスの定義です.javaで具体的なクラスをどのように定義するかと似ています.データ構造を基礎とした角度から考えたと言える.