第一章対象に向けたJavaScript

4917 ワード

前言
「JavaScriptデザインモードと開発実践」は、テンセントの先端チームAlloy Teamが出品したjsデザインモデルに関する本です.この本は主に3つの大部分に分けられています.基礎知識、設計パターンと設計原則とプログラミング技術です.基礎知識は主にjs言語の対象向け思想、多形、パッケージ、プロトタイプ、クローズド、高次関数などを紹介しています.デザインモードではないモードで、js開発によく使われる16種類のデザインモデルを紹介しました.設計の原則とプログラミングの技巧、新しい高度から常用する開発と設計の技巧を解説します.
本文は主に全書の第一部に基づいています.js基礎知識の読解経験をまとめてみます.
動的言語とアヒルのタイプ
静的構文:コンパイルする必要がある言語で、コンパイルする時にデータの種類を決定します.コンパイルする時にプログラム中のエラーを発見することができます.それはプログラマを相応の制約に従って開発することができますが、ある程度の開発効率を低下させます.
動態言語:運行時にデータの種類を決めることができます.コードは簡潔で、プログラマはより多くの精力を論理的に実現することができます.
アヒルの模型:歩いてアヒルを思い出して、アヒルのように鳴きます.それではアヒルです.アヒルの模型は私達が対象の行為だけに関心を持っていることを知っています.対象そのものではなく、has-aに関心を持っています.is-aではありません.
アヒルのモデルは、プログラミングの実現に向けてのインターフェースプログラミングではなく、動的言語での原則の実現を指導してくれます.例えば、オブジェクトの一つには、pushとpopの方法があり、これらの方法は正確な実現を提供し、それはスタックとして使用することができる.静的言語では、インターフェースプログラミングに向けては容易ではないことです.抽象的なタイプ賞の対象を通じてアップグレードする必要があります.
多形
多态の主旨思想は「何をするか」と「谁がどうするか」を分けて、つまり「変わらないこと」と「変わるかもしれないこと」を分けます.次の例のように:
    var makeSound = function(animal){
        if(animal instanceof Duck){
            console.log("   ");
        }else if(animal instanceof Chikcen){
            console.log("   ");
        }
    };
    var Duck = function(){};
    var Chicken = function(){};
    
    makeSound(new Duck());
    makeSound(new Chicken());
    
上記のコードには不変のこと(動物が呼ぶ)と変わってしまう可能性(異なる動物や異なる動物の鳴き声)が区別されていません.区別すれば次のようになります.
    var makeSound = function(animal){
        animal.sound();
    }
    
    var Duck = function(){};
    Duck.prototype.sound = function(){
        console.log("   ");
    }
    
    var Chicken = function(){};
    Chicken.prototype.sound = function(){
        console.log("   ");
    }
    makeSound(new Duck());
    makeSound(new Chicken());
これからは新しい動物が増えます.変化するものだけに注目して、変化しないものを処分しないでください.
    var Dog = function(){};
    Dog.prototype.sound = funciton(){
        console.log("   ");
    }
    makeSound(new Dog());
静的言語(javaなど)の多状態を実現する基本的な考え方は、基本的にはこの方法を定義し、その後、サブクラスは異なる実装を与え、呼び出し時にオブジェクトの多状態実現方法を通じて呼び出される.
まとめると、多形の最も根本的な役割は、プロセス化された条件分岐文をオブジェクトの多形に変換することによって、これらの条件分岐文を除去することである.それはいつも私たちに何をするかということとどうやってするかを教えてくれます.
設計モードでは、命令モード、組合せモード、およびポリシーモードは、後続の文章で説明されてもよい、多状態の典型的な代表である.
パッケージ
パッケージは、パッケージデータ、実装、パッケージデータ、およびパッケージの変更に分けることができます.
パッケージデータは主に局部的な作用領域に現れ、外部には隠しています.
    js:
    var myObj = function(){
        var name = "ahu";
        return {
            getName: function(){
                return name;
            }
        }
    }
    console.log(myObj.name) // undefined
    console.log(myObj.getName()) // ahu
    
    java:
    public Class myObj{
        private name;
        public myObj(name){
            this.name = name;
        }
        public getName(){
            return name;
        }
    }
    
    myObj nameInfo = new myObj("ahu");
    nameInfo.getName() // ahu
パッケージ実装:オブジェクトは自分の行動に責任を持ち、他のオブジェクトまたはユーザーはその内部実装に関心を持たない.このようにオブジェクト間の結合がばらばらになり、オブジェクト間は露出したAPIインターフェースを介して通信される.例えば、ディケンサ方法(jsのeach方法)は、オブジェクトを遍歴し、内部実装が変更されましたが、機能が変わらない限り、ユーザーにとっては変わりません.
パッケージタイプ:パッケージタイプは抽象的なタイプとインターフェースによって実現されます.例えば、javaの多状態.
パッケージの変化:変化を見つけてカプセル化するのは「デザインモード」の出発点であり、23種類の設計モードは、作成型モード、構造性モード、行動型モードに分類される.作成モードの目的はパッケージ作成オブジェクトの変化です.構造型のパッケージはオブジェクト間の結合関係である.挙動パターンパッケージはオブジェクトの挙動変化である.
原型モード(引き継ぎ)
プロトタイプはデザインモードでオブジェクトを作成するモードです.プロトタイプの大きなプログラムは、cloneに基づいて実現され、cloneはオブジェクトを作成する手段である.ECMAScript 5でObject.createのオブジェクトを実現するcloneを提供する場合、この方法をサポートしていないブラウザは以下の方法で互換性があります.
    Objcet.create = Object.create || function(_obj){
        var F = function(){};
        F.prototype = _obj;
        return new F();
    }
jsにおける原型継承は、以下の基本原則に従う.
  • すべてのデータは対象です.(実はjsはここで実現されていません.基礎タイプnumber、string、bootlean、undefinedはパッケージ化してオブジェクトを得る必要があります.)
  • オブジェクトを得るには、インスタンスクラスではなく、オブジェクトをプロトタイプとして見つけます.
  • です.
  • オブジェクトは、プロトタイプを覚えています.
  • オブジェクトがある要求に応答できない場合、この要求を自身のプロトタイプ(プロトタイプ検索)
  • に委託することができる.
    以下の手順:
        function person(name){ // person            js    ,           ,          
            this.name = name;
        }
        Person.prototype.getName = function(){
            return this.name;
        }
        
        var aa = new Person("ahu") // new            
        
        // new           
        var ObjectFactory = function(){
            var obj = new Object(), //  Object.prototype clone      
            Constructor = [].shift(call).agruments; //      ,    Person
            obj.__proto__ = ConStructor.prototype; //        ,              :AA.prototype.constructor = AA    
            var ret = Constructor.apply(obj, arguments); //              
            
            return  typeof ret === 'object' ?ret :obj;
        }
        
        var bb = ObjectFactory(person, "ahu");
        console.log(Object.getPrototypeOf(a) === Person.prototype);  // true
    
    Peter Norvingを当てはめると、デザインモードは言語不足の補足であり、もしデザインモードがあれば、より良い言語を探してください.