javascriptあれらの事(1)
2730 ワード
最近winder(厳冬)先生のブログを見ましたが、jsというプロトタイプの継承と普通の継承方式の違いを言います.文章は最後に面白い練習をいくつか投げて試してみました.
一般的に、オブジェクトを作成するには、次の3つのステップがあります.
1.新しいオブジェクトを構築する
2.新しい相手の_u uをプロト.関数オブジェクトの共有対象属性:prototype
3.新しいオブジェクトをthisとしてコンストラクターを実行します.
どう分かりますか
まず、すべてのコンストラクタのプロトタイプチェーンモデルを知るべきです.proto_=>Funtion.prototype.u.proto_=> Object.prototype
では、
Object.prop=>Object.uプロト.prop==Funtions.prototype.prop==1
Funtion.prop=>Function._プロト.prop==Funtions.prototype.prop==1
Object.prop=>Object.prototype.prop==1
Funtion.prop=>Function._プロト.prop==Funtions.prototype.prop=>Funtion.prototype.uプロト.prop==Object.prototype.prop==1
Object.prop=>Object.uプロト.prop==Funtions.prototype.prop==Function.uプロト.prop==1
Funtion.prop=>Function._プロト.prop==1
ObjectはFunctと同じconstructなので彼らの_u uです.プロト.属性はすべてFuntions.prototypeを指します.
var client=newクラス;
client.prop=>client.uプロト.prop==Class.prototype.prop=>Class.prototype.uプロト.プロ
またクラスのせいでプロト.prop=1.かつ、Class.prototype==クラス、=>クラス.prototype.uプロト.prop==1.
(new Class).prop=>(new Class).__プロト.prop==Class.prototype.prop==Class._uプロト.prop=>
Function.proptype.prop==1
一つの関数は声明の後、デフォルトでは自分のプロトタイプの属性を得て、新たに作成されたObjectを指します.だから:
Class.prototype._proto_==Object.prototype/trueですので、この文は実際にObject.prototypeにprop属性を追加しました.
Class.prototype._プロト.prop=1
var classe Proto=Class.prototype;
var classNewProto = Object.creat(classiProtto、{}
classinewProto._uproto_==classProto//true
Class.prototype=classinewProto;
var inst=Object.create(clast Proto、{}
ソ:
inst._uproto_== classNewProto//true
inst._uプロト.proto_==classProto//true
inst._uプロトプロト.proto_==Object.prototype/true
最後にプロトタイプチェーンを通してObject.prototypeにprop属性を見つけました.
一般的に、オブジェクトを作成するには、次の3つのステップがあります.
1.新しいオブジェクトを構築する
2.新しい相手の_u uをプロト.関数オブジェクトの共有対象属性:prototype
3.新しいオブジェクトをthisとしてコンストラクターを実行します.
Function.prototype.prop=1;
alert(Object.prop)
alert(Function.prop)
出力:1,1どう分かりますか
まず、すべてのコンストラクタのプロトタイプチェーンモデルを知るべきです.proto_=>Funtion.prototype.u.proto_=> Object.prototype
では、
Object.prop=>Object.uプロト.prop==Funtions.prototype.prop==1
Funtion.prop=>Function._プロト.prop==Funtions.prototype.prop==1
Object.prototype.prop=1;
alert(Object.prop)
alert(Function.prop)
と同じですObject.prop=>Object.prototype.prop==1
Funtion.prop=>Function._プロト.prop==Funtions.prototype.prop=>Funtion.prototype.uプロト.prop==Object.prototype.prop==1
Function.__proto__.prop=1;
alert(Object.prop)
alert(Function.prop)
の導出:Object.prop=>Object.uプロト.prop==Funtions.prototype.prop==Function.uプロト.prop==1
Funtion.prop=>Function._プロト.prop==1
ObjectはFunctと同じconstructなので彼らの_u uです.プロト.属性はすべてFuntions.prototypeを指します.
function Class(){
}
Class.prototype=Class;
Class.__proto__.prop=1
alert((new Class).prop);
ここでnewはオブジェクトを一つ作ってそのprop属性を訪問します.先に言ったオブジェクトを作る3つのステップによって、新しいオブジェクトの名前を知ることができます.プロト.属性はClassというconstructorのprototypeを指しています.var client=newクラス;
client.prop=>client.uプロト.prop==Class.prototype.prop=>Class.prototype.uプロト.プロ
またクラスのせいでプロト.prop=1.かつ、Class.prototype==クラス、=>クラス.prototype.uプロト.prop==1.
function Class(){}
Class.prototype=Class.__proto__;
Function.prototype.prop=1;
alert((new Class()).prop)
は、上記のいくつかの導出プロセスに基づいて、迅速に結果を得ることができる.(new Class).prop=>(new Class).__プロト.prop==Class.prototype.prop==Class._uプロト.prop=>
Function.proptype.prop==1
function Class(){
}
Class.prototype.__proto__.prop=1;
Class.prototype=new Class;
alert((new Class).prop);
この例はちょっと説明しにくいです.まずClass.prototypeを見てみます.プロト.prop=1これは何をしましたか?一つの関数は声明の後、デフォルトでは自分のプロトタイプの属性を得て、新たに作成されたObjectを指します.だから:
Class.prototype._proto_==Object.prototype/trueですので、この文は実際にObject.prototypeにprop属性を追加しました.
Class.prototype._プロト.prop=1
var classe Proto=Class.prototype;
var classNewProto = Object.creat(classiProtto、{}
classinewProto._uproto_==classProto//true
Class.prototype=classinewProto;
var inst=Object.create(clast Proto、{}
ソ:
inst._uproto_== classNewProto//true
inst._uプロト.proto_==classProto//true
inst._uプロトプロト.proto_==Object.prototype/true
最後にプロトタイプチェーンを通してObject.prototypeにprop属性を見つけました.