javascriptにおけるFunctオブジェクトとObjectオブジェクトの違い及び対象継承


javascriptの中の一つは関数(構造関数/構造方法とも呼ばれる)によって作成された(通常はnewキーワードで作成またはこの方法でthisオブジェクトに戻る)オブジェクトからある方法を呼び出す時、まず構造関数から探します.構造関数にない場合は構造関数のプロトタイプオブジェクトから探します.関数で作成した例はObject法の例です.Functは関数を作成する方法であり、FunctはObject法で作成されたものであり、ObjectのコンストラクタはFunctであるため、この二つは相互に作成されたものと見なされる.
次の例では、相続関係について、対象がどのような方法を持っているかを確認します.
  1,コンストラクタ継承 
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}

function SubClass()  {
	this.super = SuperClass;
	this.super();
	delete this.super;
}
SuperClassとSubClassは二つのクラスと見なすことができ、SuperClassはnewを通して出てくる対象はname属性とprint方法を持つ.
例えば:var super=new Superクラス();super.print()
SubClass構造体はSuperClassを彼のメンバー方法として実行し、SubClassが作成したインスタンスがSuperClassのprint方法とname属性を持つようにする.
delete this.superはこのオブジェクトのsuper属性を削除し、オブジェクトをこの方法にアクセスする権限がないようにします.
2,オブジェクトの名前を付けて継承します.コールやアプリで実現します.
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}

function SubClass()  {
	SuperClass.call(this)
}
SubClassでSuperClass.callとは、SuperClassを呼び出して、SuperClassの最初のパラメータでSuper Classの中のthisオブジェクトをフィッシングし、call方法の2番目のパラメータとその後のパラメータはSuperClass関数の受信パラメータに対応します.スーパークラス.call(this、param、param 2)のようです.SubClassのSuperClass.calもSuperClass.applyに変えられます.applyの意味callは基本的に一致しています.違いは、appyはSuperClass.appy(this,param,param 2)のような配列でパラメータを受信することです.call,applyは,functionキーワードまたはFunctで作成したメソッドオブジェクト,Funct,Objectのみで呼び出すことができます.
3、プロトタイプの原型の対象は継承されます.
prototypeオブジェクトとcall、applyメソッドはいずれもjavascript内部特有であり、prototypeもfunctionキーワードまたはFunctionで作成されたメソッドオブジェクト、Function、Objectでのみ呼び出すことができる属性である.
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}
SuperClass.prototype.say = function() {
	alert(this.name);
}
このようにSuperClass構造の実例はsayという方法を持っています.構造された例は、say方法を実行する時に、SuperClass構造体から探すので、見つけたら構造体の中のsay方法を実行します.
SuperClassのprototypeオブジェクトで探すと、デフォルトではprototypeオブジェクトはObjectの例はnew Object()または{}に相当します.
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}
SuperClass.prototype.say = function() {
	alert(this.name);
}
function SubClass()  {
	this.subname = 2;
}
SubClass.prototype = new SuperClass();
上記の分析によれば、SubClass方式で作成されたオブジェクトはsubnameという属性のほかに、SubClass.prototypeオブジェクトの属性と方法を継承します.つまり、name、print、sayなどの属性と方法を備えています.
Function.prototype = {
		arg:3,
		all:function(){
			alert("         all   arg  "+this.arg);
		}};
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}
SuperClass.prototype.say = function() {
	alert(this.name);
}
function SubClass()  {
	this.subname = 2;
}
SubClass.prototype = new SuperClass();

//  :
SuperClass.all();
SubClass.all();
Function.all();
Object.all();
javascriptプロトタイプ継承法の特徴によって、FunctionキーまたはFunctionが作成した方法は、Function(彼自身もfunction)が作成した例であり、Function.prototypeにいくつかの方法や属性を注入すると、すべての方法や属性があります.
Functionのprototypeにall方法を追加したら、すべての方法にall方法があります.FunctとObject自体も方法ですので、all方法もあります.
Object.prototype = {
		arg:3,
		all:function(){
			alert("         all   arg  "+this.arg);
		}};
function SuperClass() {
	this.name = 1;
	this.print = function() {
		alert("print super");
	}
}
SuperClass.prototype.say = function() {
	alert(this.name);
}
function SubClass()  {
	this.subname = 2;
}
SubClass.prototype = new SuperClass();

//  :
SuperClass.all();
SubClass.all();
Function.all();
Object.all();
new SuperClass().all();
new SubClass().all();
このようなallを全ての対象に持たせる方法はObjectのProttotypeに注入する方法です.
上記の例ではSuperClass構造の例もall方法を持っています.
 
javascriptの継承は他のオブジェクトが持つ属性と方法を一つのオブジェクトで継承します.継承されるオブジェクトのコンストラクタとは直接関係がありません.オブジェクトの方法コンストラクタはこのオブジェクトの作成時に持っている初期属性と方法を決定するだけで、このオブジェクトは後に所有する属性と方法を変更することができます.(このオブジェクトを削除または追加する方法や属性など)これはjavascriptのダイナミック性です.javascriptは変数を定義したり、パラメータの特定のタイプを定義する必要はありません.(javascriptの弱いタイプ)、javascriptは運行中にデータを検証します.