!javascript作用ドメインチェーンの原理と原型チェーン
1677 ワード
一つの関数では、実行時に識別子が表示されます.
識別子はxであり、局所変数または外層変数、または大域変数、または関数オブジェクト自体の属性でありうる.
1.スコープ内で検索します.もし2が見つからなかったら、プロトタイプチェーンで探してください.
2.識別子x.aは、this.aを含む.先に前のようにxを見つけて、xのプロトタイプチェーンの中でaを見つけます.
function a()
{
this.x=function x()
{
alert(「aa」)
}
)
function b()
{
機能 x()
{
alert("ab")
}
x()
b.prototype.x()
}
b.prototype=new a
b.com nstructor=b;
b()// alert(「ab」);alert(「aa」);
考慮する
クラスA 0
{
int a;//インスタンス変数a 0.
void A 1()
{
int a;//局所変数a 1
void A 2()
{
int a;//局所変数a 2
a=0;//ここのaはa 2であることは明らかです.まず作用ドメインチェーンによって探してみます.見つけられなくて、原型チェーンによって探します.
} }
)
二次元スコープ検索
スコープ内で変数オブジェクトの属性を検索します.(もしあれば)ECMAScriptからのプロトタイプ特性を考慮しなければなりません.
属性がオブジェクト内に直接発見されていない場合は、クエリーはプロトタイプチェーン内で継続されます.すなわち、常に二次元チェーンで検索されます.
(1)作用ドメインチェーン環節;(2)各作用ドメインチェーン――原型チェーン環節に深く入り込む.Object.prototypeで属性を定義したら、この効果が見られます.
識別子はxであり、局所変数または外層変数、または大域変数、または関数オブジェクト自体の属性でありうる.
1.スコープ内で検索します.もし2が見つからなかったら、プロトタイプチェーンで探してください.
2.識別子x.aは、this.aを含む.先に前のようにxを見つけて、xのプロトタイプチェーンの中でaを見つけます.
function a()
{
this.x=function x()
{
alert(「aa」)
}
)
function b()
{
機能 x()
{
alert("ab")
}
x()
b.prototype.x()
}
b.prototype=new a
b.com nstructor=b;
b()// alert(「ab」);alert(「aa」);
考慮する
クラスA 0
{
int a;//インスタンス変数a 0.
void A 1()
{
int a;//局所変数a 1
void A 2()
{
int a;//局所変数a 2
a=0;//ここのaはa 2であることは明らかです.まず作用ドメインチェーンによって探してみます.見つけられなくて、原型チェーンによって探します.
} }
)
二次元スコープ検索
スコープ内で変数オブジェクトの属性を検索します.(もしあれば)ECMAScriptからのプロトタイプ特性を考慮しなければなりません.
属性がオブジェクト内に直接発見されていない場合は、クエリーはプロトタイプチェーン内で継続されます.すなわち、常に二次元チェーンで検索されます.
(1)作用ドメインチェーン環節;(2)各作用ドメインチェーン――原型チェーン環節に深く入り込む.Object.prototypeで属性を定義したら、この効果が見られます.
function foo() {
alert(x);
}
Object.prototype.x = 10;
foo(); // 10, ,
活動対象に原型がないので、次の例で見られます.function foo() {
var x = 20;
function bar() {
alert(x);
}
bar();
}
Object.prototype.x = 10;
foo(); // 20, , 。