ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript オブジェクト指向の基本とこのポインティング問題の具体的な分析

JavaScript オブジェクト指向の基本とこのポインティング問題の具体的な分析

黄舟
黄舟オリジナル
2017-10-16 11:07:431490ブラウズ

以下のエディターは、JavaScript オブジェクト指向の基本とこのポインティングの問題に関するありふれた記事を提供します。編集者はこれがとても良いと思ったので、参考として共有します。編集者をフォローして、一緒に見てみましょう

はじめに

私たちのプログラミング言語は、「マシン指向」から「プロセス指向」、そして「オブジェクト指向」へのプロセスを経てきました。 JavaScript は、プロセス指向とオブジェクト指向の中間のオブジェクトベースの言語です。 JavaScript を学習するプロセスにおいて、OOP は非常に重要な部分です。JS におけるオブジェクト指向のアプローチについて説明しましょう。 ! !

1. OOP の基本的な質問

1.1 プロセス指向とオブジェクト指向とは何ですか?

プロセス指向: 問題を解決する方法のプロセスステップに焦点を当てます。プログラミングの特徴は、クラスやオブジェクトの概念を持たず、処理の各ステップを一つ一つ関数で実装することです。

オブジェクト指向: どのオブジェクトが問題を解決するかに焦点を当てます。プログラミングの特徴は、クラスが次々と現れ、そのクラスからオブジェクトを取得して特定の問題を解決することです。

呼び出し元にとって、プロセス指向では、呼び出し元がさまざまな関数を自分で実装する必要があります。一方、オブジェクト指向では、呼び出し元がメソッドの実装の詳細を理解する必要がなく、オブジェクト内の特定のメソッドの機能を呼び出し元に伝えるだけで済みます。

1.2 オブジェクト指向の三大特徴

継承、カプセル化、ポリモーフィズム

1.3 クラスとオブジェクトの関係

① クラス:同じ特性(属性)と動作を持つクラス(メソッド) ) コレクション。

例:人間 --> 属性:身長、体重、性別 方法:食べる、話す、歩く

② オブジェクト:クラスの中から、ある属性値と方法を持つ個体を取り出します。

例: Zhang San --> 属性: 身長 180、体重 180 メソッド: 話す --> 私の名前は Zhang San、身長 180 です

③ クラスとオブジェクトの関係

クラスは抽象、オブジェクトは具象 (クラスはオブジェクトの抽象化であり、オブジェクトはクラスの具体化です)

説明:

クラスは属性とメソッドを持っているとしか言えませんが、特定の値を持っています。属性に割り当てることはできません。たとえば、人間には名前がありますが、その名前が何であるかを言うことはできません。 。 。

オブジェクトは特定のインスタンスであり、クラス内の属性に特定の値を割り当てる個体です。たとえば、張三が一人の人間である場合、張三の名前は張三であると言えます。つまり、張三は人間の各属性に特定の割り当てを行っているため、張三は人間によって生成されたオブジェクトです。

2. JavaScript のオブジェクト指向

2.1 クラスとオブジェクトを作成する手順

①クラス (コンストラクター) を作成します: クラス名はビッグ キャメル ケース ルールを使用する必要があります。各単語の番号 最初の文字は大文字にする必要があります。


function 类名(属性1){
  this.属性1 = 属性1;
  this.方法 = function(){
   //方法中要调用自身属性,必须要使用this.属性
  }
}

② クラスを通じてオブジェクトをインスタンス化(新規)します。

var obj = 新しいクラス名 (属性 1 の特定の値);

obj.property; メソッドを呼び出す

>>>オブジェクトを新しく作成するプロセスは「クラスのインスタンス化」と呼ばれます

>>> クラス内の this は、インスタンス化中に新しく作成されたオブジェクトを指します。したがって、this.property と this.method は実際に、新しく作成されるオブジェクトにプロパティとメソッドをバインドします。

>>>クラスで独自のプロパティを呼び出すには、this.property 名を使用する必要があります。変数名を直接使用すると、対応するプロパティにアクセスできません。

>>>クラス名はビッグキャメルケースルールを使用する必要があり、通常の関数との違いに注意してください。

2.2 2つの重要な属性コンストラクターとinstanceof

①constructor: 現在のオブジェクトのコンストラクターを返します>>>zhangsan.constructor = person; √

②instanceof: オブジェクトがオブジェクトであるかどうかを検出します。クラスのインスタンス;

>>>lisi インスタンスオブ パーソン √ lisi は パーソン クラスを通じて生成されます new

>>>lisi オブジェクト √ すべてのオブジェクトはオブジェクトのインスタンスです

>>> ;パーソンオブジェクトのインスタンス √ 関数自体もオブジェクトです

3. JavaScript におけるこの指摘の問題

前のパートでは、クラスを作成し、このクラスを通じてオブジェクトを新規作成しました。 ただし、その中にはこれがたくさんあります。 多くの学生は「これ」という意味ではないでしょうか?関数内で記述した this で定義された属性が、関数 new で生成されたオブジェクトになるのはなぜですか? ? 3.1 最終的に関数を呼び出す人は誰でも、これは を指します!

① これが誰を指すのかは、関数が宣言される場所ではなく、関数が呼び出される場所を考慮する必要があります。 !

② これが指すものは常にオブジェクトのみであり、関数ではありません。 !

③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。

3.2this指向的规律(与函数的调用方式息息相关!)

① 通过函数名()调用的,this永远指向window


func(); // this--->window
//【解释】 我们直接用一个函数名()调用,函数里面的this,永远指向window。

② 通过对象.方法调用的,this指向这个对象


// 狭义对象
 var obj = {
  name:"obj",
  func1 :func
 };
 obj.func1(); // this--->obj
//【解释】我们将func函数名,当做了obj这个对象的一个方法,然后使用对象名.方法名, 这时候函数里面的this指向这个obj对象。

 // 广义对象
 document.getElementById("p").onclick = function(){
  this.style.backgroundColor = "red";
}; // this--->p
//【解释】对象打点调用还有一个情况,我们使用getElementById取到一个p控件,也是一种广义的对象,用它打点调用函数,则函数中的this指向这个p对象。

③ 函数作为数组的一个元素,用数组下标调用,this指向这个数组


var arr = [func,1,2,3];
arr[0](); // this--->arr
//【解释】这个,我们把函数名,当做数组中的一个元素。使用数组下标调用,则函数中的this将指向这个数组arr。

④ 函数作为window内置函数的回调函数使用,this指向window。比如setTimeout、setInterval等


setTimeout(func,1000);// this--->window
//setInterval(func,1000);
//【解释】使用setTimeout、setInterval等window内置函数调用函数,则函数中的this指向window。

⑤ 函数作为构造函数,使用new关键字调用,this指向新new出的对象


var obj = new func(); //this--->new出的新obj
//【解释】这个就是第二部分我们使用构造函数new对象的语句,将函数用new关键字调用,则函数中的this指向新new出的对象。

3.3关于this问题的面试题


var fullname = 'John Doe';
var obj = {
  fullname: 'Colin Ihrig',
  prop: {
    fullname: 'Aurelio De Rosa',
    getFullname: function() {
      return this.fullname;
    }
  }
};
console.log(obj.prop.getFullname()); 
// 函数的最终调用者 obj.prop 
   
var test = obj.prop.getFullname;
console.log(test()); 
// 函数的最终调用者 test() this-> window
   
obj.func = obj.prop.getFullname;
console.log(obj.func()); 
// 函数最终调用者是obj
   
var arr = [obj.prop.getFullname,1,2];
arr.fullname = "JiangHao";
console.log(arr[0]());
// 函数最终调用者数组

好了,这篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,下面我会继续给大家分享关于面向对象方面的问题。多谢大家的支持!!!

以上がJavaScript オブジェクト指向の基本とこのポインティング問題の具体的な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。