5

カプセル化、継承、ポリモーフィズム、抽象化などの一般的なオブジェクト指向プログラミングの原則を認識しています。

しかし、JavaScript の観点からこれらの概念を理解したいと思うでしょう。誰かが非常に基本的な例を挙げて、これらが JS コンテキストでどのように機能するかを実行できますか (カプセル化、継承、ポリモーフィズム、抽象化)

私はこれらについてオンラインで多くのことを読みましたが、記事は私をより混乱させました.

ありがとうございました。

4

4 に答える 4

20

オブジェクト指向プログラミング言語で使用されるスタイルを模倣する Douglas Crockford パターンについて説明します。プロトタイプの継承は使用しません。その結果、各オブジェクトが各メソッドへの参照を格納する必要があるため、効率がわずかに低下します。しかし、説明目的には非常に便利です。

カプセル化:

function MyClass (a, b)
{
    this.publicProperty = 1;
    var _privateProperty = 2;
    function _privateMethod () {
        // only private methods and privileged methods can call this
    };
    this.publicMethod = function () {
        // can access _privateProperty and call _privateMethod
    };
}
MyClass.classMethod = function () {
    // not tied to any instances
};

でオブジェクトを作成するだけですvar instance = new MyClass(a, b);

継承:

function DerivedClass(a, b, c) 
{
    // must explicitly call superclass constructor, like in Java
    MyClass.apply(this, arguments);

    this.anotherProperty = 3;
    function _anotherPrivateMethod() { };

    this.publicMethod = function () {
        // can access _privateProperty and call _privateMethod
    };
}
DerivedClass.classMethodMethod = function ()
{
    // not tied to any instances
};

JavaScript のポリモーフィズムは、ほとんどがダック タイピング ( http://en.wikipedia.org/wiki/Duck_typing )に置き換えられています。開発者は通常、オブジェクトの下にメソッド/プロパティをグループ化し、それらのオブジェクトの存在をテストするだけです。これは、たとえば、新しいブラウザー機能が検出される方法です。

抽象化はポリモーフィズムと密接に結びついています。何かがインターフェイスをサポートしている限り、通常はその下でどのように動作するかは気にしません。したがって、Javascript ライブラリをダウンロードして、そのドキュメントに基づいて使用することができます。

お役に立てれば。

于 2013-02-20T07:35:24.563 に答える
5

多くの人が適切に使用していないため、最も興味深いのはカプセル化だと思います。

単純なオブジェクトを例に取りましょう

var Person = function( firstName, lastName, isMr ) {
    var prefix = isMr ? "Mr." : "Mrs." ; 
    this.getFullName = function() { return prefix + " " 
                                       + firstName + " " + lastName }

}

 var p = new Person ("guy","mograbi", true);
 p.getFullName(); // => "Mr. guy mograbi"
// p.prefix ==> causes an error. 

継承- プロトタイプを拡張するだけです

 var Superhero = function(){
            Person.call(this);

  }

ただし、適切な継承はそれ自体が問題です。https://stackoverflow.com/a/4985616/1068746をご覧ください

ポリモーフィズム- 「getFullName」を実装する新しいプロトタイプを考えると、非常に単純です

var Child = function(){
    this.getFullName = function(){ return "not allowed to talk with strangers" }
}

a が Person の場合function(a){ a.getFullName() } はフルネームを取得し、a が Child の場合は「許可されていません..」を取得します。

抽象化- よりタイプセーフな言語です。 https://stackoverflow.com/a/4082496/1068746

于 2013-02-20T05:51:36.463 に答える
4

関数を使用してシングルトン オブジェクトを定義できます

var apple = new function() {
    this.type = "macintosh";
    this.color = "red";
    this.getInfo = function () {
        return this.color + ' ' + this.type + ' apple';
    };
}

以下のように使用します

apple.color = "reddish";
alert(apple.getInfo());

new function(){...}関数 (匿名コンストラクター関数) を定義し、それを new で呼び出すという 2 つのことを同時に行います。

于 2013-02-20T05:08:16.907 に答える
2

次のリンクを見てください。

  1. Introduction_to_Object-Oriented_JavaScript
  2. オブジェクト指向の JavaScript の基本的な概念
于 2013-02-20T05:08:23.800 に答える