JavaScriptオブジェクト指向プログラミングの理解!

      プログラミングの知識を持っている人は、オブジェクト指向が理解するのが非常に難しい概念であることを知っています。次のXiaoqianは、オブジェクトの理解をあなたと共有します。この記事は、主にオブジェクトのカプセル化を共有します。もちろん、実生活でのオブジェクト指向もかなり難しいですよね〜

      1つは、インスタンスオブジェクトの元のモードです。

      まず、すべてのオブジェクトがオブジェクトであることがわかります。たとえば、オブジェクトとしての「犬」には、「タイプ」と「色」の2つの属性があります。

1

      次に、2つのインスタンス化されたオブジェクトを作成する必要があります

2

      これは、最も基本的なオブジェクトのカプセル化でもあります。つまり、「type」と「color」の2つの属性を1つのオブジェクトに配置します。しかし、ここに問題があります。この記述方法には2つの問題があります。1つは、インスタンス化されたオブジェクトを多数生成する場合、何度も繰り返す必要があることです。これは非常に面倒です。もう1つは、非常に面倒なことです。プロトタイプの犬の構造に似ていますが、実際には直接確立されていません。連絡先。

      第二に、元のモデルのアップグレード

      重複コード、解決する関数を書くことができます

3

      次に、関数を呼び出してインスタンス化されたオブジェクトを生成します

4

      このメソッドは、複数のインスタンス化されたオブジェクトコードを生成するという複雑な問題を解決できますが、dog1とdog2の間に関連付けはありません。つまり、それらが実際にプロトタイプオブジェクトDogのインスタンスであることを反映していません。

      三、コンストラクター

      インスタンス化されたオブジェクトをプロトタイプオブジェクトから生成する必要があるという問題を解決するために、jsはコンストラクターの概念を提供します。もちろん、コンストラクターは基本的には通常の関数ですが、関数はこれを内部で使用します。通常の関数と区別するために、コンストラクターの最初の文字を大文字にします。具体的なコードは次のとおりです。

5

      このコンストラクターを使用すると、インスタンス化されたオブジェクトを生成できます。具体的なコードは次のとおりです。

6

      ここで、キーワードnewを確認できます。これは、Dogが実際にはオブジェクトであり、dog1とdog2がDogのインスタンス化されたオブジェクトであることを意味します。これを確認するために、jsは、構築関数を指すために使用されるプロパティコンストラクターを提供します。

7

      もちろん、jsには別の演算子instanceofもあり、プロトタイプオブジェクトとインスタンス化されたオブジェクトの関係を確認できます。

8

      ここではコンストラクターは完璧に見えますが、ここには大きな欠点があります。それはメモリの浪費です。たとえば、次のように、定数プロパティとメソッドをDogオブジェクトに追加します。

9

      当然这里生成实例化方法也还是一样的,但是这里会有一个很大的问题:也就是我们会发现age属性和eat()方法明明是一模一样的内容,但是由于每次生成实例化对象时,都会生成同样的内容,多造成内存浪费。

console.log(dog1.eat == dog2.eat); // false

      如果能让age和eat()在内存中只生成一次,让实例化对象指向同一个内存地址就更完美了。

      四,prototype模式

      js为每一个构造函数都提供了一个prototype属性,让他指向另一个对象,而这个对象的所有属性和方法都会被构造函数的实例对象继承。这也就意味着,只要我们把那些不变的属性和方法定义在prototype对象上即可。

10

      接着再生成实例,此时,所有实例的age个eat()方法都会指向同一个内存地址,也就是prototype对象,这样也就避免了内存浪费问题,从而提供运行效率。

console.log(dog1.eat == dog2.eat); // true

      当然为了验证这一问题,js定义了一些辅助属性。

      1. isPrototypeOf() , 此方法用于验证prototype对象和实例化对象之间的关联

console.log(Dog.prototype.isPrototypeOf(dog1)); // true
console.log(Dog.prototype.isPrototypeOf(dog2)); // true

      2. HasOwnProperty() , 每个实例化对象都有此方法,顾名思义,这个方法是用于验证属性是自有的还是继承自prototype对象的 ; 这里很显然type是自有属性,而age是继承自prototype对象。

console.log(dog1.hasOwnProperty( 'type'))// true 
console.log(dog1.hasOwnProperty( 'age'))// false

この記事はQianfengEducationからのものです、転載のソースを示してください。

おすすめ

転載: blog.51cto.com/15128702/2678106
おすすめ