javascriptは種類の方式の3を書きます.


前の二つの長所を取る:
a、構造関数でクラスの属性(フィールド)を定義する
b、プロトタイプでクラスを定義する方法.
第三の方法があります.このような方式は採用する人が多いようです.
 
3、総合構造関数/原型
 
/**
 * Person :     ,    name,   getName  
 * @param {String} name
 */
function Person(name) {
	this.name = name;
}
Person.prototype.getName = function() {
	return this.name;
}
 
このようにすれば、構造関数によって異なるnameを構築することができ、対象事例もget Name方法を共有し、メモリの無駄を生じない.
 
しかし、このようなコードスタイルは、Javaのクラスほどコンパクトではないようです.属性、構造方法(関数)、方法は、大括弧に包まれています.
 
public class Person {

	//  (  )
	String name;	
	//    (  )
	Person(String name) {
		this.name = name;
	}	
	//  
	String getName() {
		return this.name;
	}
}
 
 
jsコードのスタイルをよりコンパクトにするために、プロトタイプのメソッドコードをfunction Personの大かっこに移動します.
 
function Person(name) {
	this.name = name;
	Person.prototype.getName = function() {
		return this.name;
	}
}
 
不思議なようです.このように書くことができます.検証してみます
 
var p1 = new Person("Jack");
var p2 = new Person("Tom");
console.log(p1.getName());//Jack
console.log(p2.getName());//Tom
 
エラーがありません.コンソールも正しく出力しました.説明はこのように書いてもいいです.
 
うん、完璧そうです.
a、オブジェクトの例を参照して作成することができます.
b、対象事例はすべて同じ方法を共有し、メモリの無駄を生じない
c、コードスタイルもコンパクトです.
 
ただし、newのオブジェクトは毎回実行されます.  
Person.prototype.getName=function()        return this.name;
不必要な反復演算をもたらした.get Nameメソッドはprototypeにかけるので、一回だけ実行すればいいです.少し改造するだけで:
 
function Person(name) {
	this.name = name;

	if(Person._init==undefined) {
		alert("      !");
		Person.prototype.getName = function() {
			return this.name;
		}
		Person._init = 1;	
	}	
}
 
new二つのオブジェクト、
 
var p1 = new Person("Andy");//   new   '      !'
var p2 = new Person("Lily");//  new