記事ディレクトリ
プロトタイプチェーンプロパティの問題
- オブジェクトのプロパティ値を読み取る場合:プロトタイプチェーンで自動的に検索されます
- オブジェクトのプロパティ値を設定する場合:プロトタイプチェーンは検索されません。現在のオブジェクトにこのプロパティがない場合は、このプロパティを直接追加して値を設定してください。
- メソッドは通常、プロトタイプで定義され、プロパティは通常、コンストラクターを介してオブジェクト自体で定義されます。
上記のルールは、次の例から見つけることができます。
function Fn() {
}
Fn.prototype.a = 'xxx'
var fn1 = new Fn()
console.log(fn1.a) //xxx
var fn2 = new Fn()
fn2.a = 'yyy'
console.log(fn1.a, fn2.a) //xxx yyy
fn2の場合:
instanceof
- instanceofはどのように判断されますか?
- 式:Bのインスタンス
- Bコンストラクターの明示的なプロトタイプオブジェクト(プロトタイプ)がAオブジェクトのプロトタイプチェーン上にある場合(つまり、交差がある場合)はtrueを返し、そうでない場合はfalseを返します。
- 関数は、new自体によって生成されたインスタンスです
次の2つの例からinstanceofを理解できます
。①
/*
案例1
*/
function Foo() {
}
var f1 = new Foo()
console.log(f1 instanceof Foo) // true
console.log(f1 instanceof Object) // true
プロトタイプチェーンは暗黙のプロトタイプチェーンとも呼ばれるため、接続として__proto__を使用し、ノードとしてプロトタイプを使用するライン、つまりプロトタイプチェーンに注意を払う必要があります。
②
/*
案例2
*/
console.log(Object instanceof Function) // true
console.log(Object instanceof Object) // true
console.log(Function instanceof Function) // true
console.log(Function instanceof Object) // true
function Foo() {
}
console.log(Object instanceof Foo) // false
可変巻上および機能巻上
- 変数宣言の巻き上げ
- varを介して定義(宣言)された変数は、定義ステートメントの前にアクセスできます。
- 値:未定義
- 関数宣言の巻き上げ
- 関数を介して宣言された関数は、直前に呼び出すことができます
- 値:関数定義(オブジェクト)
確認:
<script type="text/javascript">
console.log('-----')
/*
面试题 : 输出 undefined
*/
var a = 3
function fn () {
console.log(a)
var a = 4
}
fn()
console.log(b) //undefined 变量提升
fn2() //可调用 函数提升
// fn3() //不能 变量提升
var b = 3
function fn2() {
console.log('fn2()')
}
var fn3 = function () {
console.log('fn3()')
}
</script>
必要なポイントがあります:
var fn3 = function () {
console.log('fn3()')
}
このように宣言された関数は、関数としてではなく、変数として持ち上げられます。関数の巻き上げが必要な場合は、関数宣言のみを使用できます。
実行コンテキスト
①コード分類(場所)
- グローバルコード
- 関数(ローカル)コード
②グローバル実行コンテキスト
- グローバルコードを実行する前に、ウィンドウをグローバル実行コンテキストとして決定します
- グローバルデータの前処理
- var ==> undefinedで定義されたグローバル変数、windowのプロパティとして追加
- 関数==>割り当て(fun)によって宣言されたグローバル関数、ウィンドウのメソッドとして追加
- this ==> Assignment(window)
- グローバルコード実行を開始します
③関数実行コンテキスト
- 関数を呼び出して関数本体を実行する準備をする前に、対応する関数実行コンテキストオブジェクト(仮想、スタック内に存在し、外部からは見えない閉じた領域)を作成します。
- ローカルデータの前処理
- 正式なパラメータ変数==>割り当て(実際のパラメータ)==>実行コンテキストとして追加された属性
- 引数==>割り当て(引数のリスト)、実行コンテキストのプロパティとして追加
- var ==> undefinedで定義されたローカル変数、実行コンテキストのプロパティとして追加
- 関数によって宣言された関数==>代入(fun)、実行コンテキストとして追加されたメソッド
- this ==> Assignment(オブジェクト呼び出し関数)
- 関数本体コードの実行を開始します