jsオブジェクト指向2日目

------------------------面接でよくある質問: 配列の重複排除、いくつかの要約、下に降りてノックする----- --------------

IIEF を使用するのが最善です。

1) 2層ループプラススプライス方式

2) 重複排除のインデックス

3) 重複排除を含む

4) 空のオブジェクトを使用してカバレッジ メソッドを置き換えます

5) 再帰の使用

。。。

--------------------------------------------------今日の内容を開始します --------------------------------------

1: プロトタイプとプロトタイプ チェーン

prototype原型:

1) 各関数には多くの属性とメソッドがあり、プロトタイプ属性があり、それに対応する値がオブジェクトであり、これをプロトタイプ オブジェクトと呼びます。

2) 多くのプロパティとメソッドがプロトタイプ オブジェクトに配置されます

3) 各プロトタイプ オブジェクトにはコンストラクターが必要です。コンストラクターも属性名であり、その値は現在の関数 (クラス) そのものです。

4) 各オブジェクトには属性 __proto__ があり、対応する値はそのオブジェクトを作成したクラスのプロトタイプ オブジェクトです。

5) このプロトタイプ オブジェクトには __proto__ もあり、これは Object に対応するプロトタイプ オブジェクト (基底クラス) に対応します。object は最上位クラスであるため、基本クラスとも呼ばれます。

6) したがって、Object.prototype.__proto__ はそれ自体を指します。それ自体を指すことは意味がないため、デフォルト値は null です。

プロトタイプチェーン

属性を探すなら、まず自分自身の内側(プライベート)を見つめてください。

あるならそれを使い、後ろを振り向かないでください。

そうでない場合は、__proto__ に従い、クラス プロトタイプ オブジェクトのプロパティを見つけ、Object.prototype が見つかるまで検索を続けます。

---------------------------------- ここに 2 つのクイズがあります ----------- ----プロトタイプのチェーンで巻かれているかどうかを確認します

function Func(){ 
    this.name = "张" 
} 
let obj1 = new Func(); 
obj2 = new Func(); とします。

Func.prototype.say = function(){ 
    console.log("say...") 
}
テスト質問
console.log(obj1.say === obj2.say)
、 obj1 と obj2 は同じプロトタイプ オブジェクトを指しており、内部のメソッドは一貫しています
console.log(Func.prototype.say === obj1.say)
、 obj1 には何も言えません。そのプロトタイプ オブジェクトに移動して見つけてください。そのプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します。 console.log (obj1.__proto__.say === Func.prototype.say
)  
、 obj1 のプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します
console.log(obj1.__proto__ === Func.prototype)
、 obj1 のプロトタイプ オブジェクトは、このオブジェクトを作成したクラスのプロトタイプ オブジェクトを指します
console.log(obj1.name === obj2.name )
、、両方のオブジェクトにはパラメータがありません、どちらも未定義です、 true を返します
console.log(obj1 instanceof Func)
、、 func もオブジェクトです
console.log(obj1 instanceof Object )
、、は同じタイプです

テスト2

var arr1 = 新しい配列("a","b","c") 
var arr2 = 新しい配列("d","e","f")
console.log(Array.prototype === arr1.__proto__) 
、配列は組み込みオブジェクト、組み込みクラス、コンストラクターに属し、arr1 のプロトタイプ オブジェクトは、それを作成したクラスのプロトタイプ オブジェクトに対応します console.log 
( Array.prototype.push == = arr1.push) 
、arr1 にはプッシュはありません。プロトタイプ オブジェクトに移動してそれを見つけます。そのため、プロトタイプ オブジェクトのプッシュに相当します。 console.log( 
arr1 === arr2 ) 
、 arr1 と arr2 は 2 つのヒープであり、同じではなく、 false 
console.log(arr1 instanceof Array)です
console.log(arr1 オブジェクトのインスタンス) 
. 
console.dir(arr1.__proto__)//プロトタイプ オブジェクト
console.dir(arr1.__proto__.__proto__)//プロトタイプ オブジェクトは、基本クラスのオブジェクトが指すプロトタイプ オブジェクトを指します
console.dir(arr1.__proto__.__proto__.__proto__) //ヌル

2. 対処が難しい

この質問に関して、これが表示されるいくつかの場所

1) リスナーでは、これはイベント ソースを表します。

btn イベント ソース、プレフィックス、イベント タイプをクリック

2) 非厳密モード。これは通常の関数で表示されます (ウィンドウを意味します)。厳密モードでは未定義を意味します。

厳密モード: 厳密を使用します。

3) これはオブジェクトのメソッドに表示され、現在のオブジェクトを示します。

4) これはコンストラクターに表示され、新しいオブジェクトを指していることを示します。

5) グローバル変数の下では、これはウィンドウを意味します

これの本質: メソッド内の this は不確実性を指します。メソッドを誰がこれと呼ぶにせよ、これは誰を指しますか

一連の練習問題:

(1)

function Func(){ 
    this.a = 1; 
    this.b = 2; 
    this.say = function(){ 
        console.log(this.a) 
    } 
} 
Func.prototype.say = function(){ 
    console.log(this .b) 
} 
Func.prototype.jump = function(){ 
    // ジャンプ メソッドを呼び出した人、ジャンプ メソッド内のこれは誰です
    console.log(this.a+this.b) 
} 
let wc = new Func(); 
wc.jump(); // 3

(2)

function Func(){ 
    this.a = 1; 
    this.b = 2; 
    this.say = function(){ 
        console.log(this.a) 
    } 
} 
Func.prototype.say = function(){ 
    // 誰が Say を呼び出したかこのメソッド、そしてこれは誰です
    // wc.__proto__ 
    console.log(this.b) 
} 
Func.prototype.jump = function(){ 
    console.log(this.a+this.b) 
} 
let wc = new Func ( ); 
// プロトタイプ オブジェクトのメソッドが呼び出されることを明確に指摘します
// wc.__proto__ それはsay メソッドを呼び出します、そしてこのメ​​ソッドの this は wc.__proto__ 
wc.__proto__.say(); // 未定義

(3)

関数 Func(){ 
    this.a = 1; 
    this.b = 2; 
    this.say = function(){ 
        console.log(this.a) 
    } 
} 
Func.prototype.say = function(){ 
    console.log(this.b) 
} 
Func.prototype.jump = function(){ 
    // コチラこの表示 wc.__proto__ 
    console.log(this.a) // 未定義
    console.log(this.b) // 未定義
    console.log(this.a+this.b) // NaN 
} 
let wc = new Func( ); 
wc.__proto__.jump(); // NaN

3. 無名関数に関するいくつかの質問

1) var f =function(){}、これは f に無名関数を割り当てます。

上記の無名関数式では、この無名関数の関数名 g を指定できます。

var f = function g(){console.log("はは...")}

 f()

g()// が出力されますが、g は定義されていません

//前に述べたように、関数式の関数名を通じて呼び出すことはできないため、g() ではなく f() を通じてのみ呼び出すことができます。

2) では、匿名関数名を使用するにはどうすればよいでしょうか? 次に、それを独自の関数本体で使用します

例えば:

var f = function g(){ console.log(g) // g は関数名で、
   関数本体で
    g() を使用できます; // この関数は g() を通じて呼び出すことができますが、終了がない場合は無限ループ
  g = 1; // 基本データ型を g に代入しても効果はありません
 g = []; // 参照データ型を g に代入しても効果はありません
  g = {}; 
   g = function(){ 
        console.log("xixi..." ) 
   } 
    console.log(g) 
} 
 f()

匿名関数名の考慮事項を要約すると、次のようになります。

1) 関数本体で匿名関数名を使用できる

2) 直接呼び出すこともできますが、出口がない場合は無限ループになります。

3) 基本データ型も参照データ型も再割り当てできません。

4) 要約すると、関数式の場合、関数名を持つことができ、内部的に呼び出すことができますが、関数名を使用して外部から呼び出すことはできません。

------------------------- 2 つの例で練習しましょう ---- -----------------------

(1)

var a = 関数 abc(num) { 
    abc = num; 
    console.log(num)    
    console.log(abc)   
    console.log(abc の種類) 
} 
 a(1)

(2)

var a = 関数 abc(num) { 
    abc = num; 
     1 を返します。
 a(1) 
 console.log 
 (abc())

 

4. これを実践するために、これを(もう少し)要約する次の面接の質問を見つけてください。

 

 

おすすめ

転載: blog.csdn.net/zwy1231/article/details/103487080