typescript上手-タイプ(3)

33040 ワード

紹介する
伝統的なjavascriptは対象だけで、類の概念がなく、対象に向かってプログラミングするにはあまり良くない設計です.問題を発見した時、すでに何千何万人もの人が使っていました.だから、大きな修正はほとんどなくて、いろいろな修繕して補っています.核心はやはりプロトタイプをめぐって遊びます.
クラス
ここにまずes 5を置いて一つのクラスを定義します.
	function Cat(name){
		this.name = name;
		this.say = function(){console.log(this.name)}
	}
	var cat1 = new Cat('dahuang')
	cat1.say();
	//  dir        _proto_   
クラスを使ってクラスを定義します.
	class Cat{
        constructor(name){
            this.name = name;
        }
        say(){ console.log(this.name) }
    }
    var cat1 = new Cat('dahuang')
    cat1.say();
スープを換えても薬を換えないで、見たところいずれにしても楽になりました.以下はts中類の定義です.
	class Cat {
	    name: string;//  
	    constructor(name: string) {//          
	        this.name = name;
	    }
	    say():void{//  
	        console.log(this.name)
	    }
	}
	var cat1 = new Cat('dahuang')
    cat1.say();
実行の順序はnewである.catの例を構築し、cat類の構造関数を呼び出して、入ってきたdahuangを属性に与えた.
引き継ぐ
継承面ではes 6のクラスの継承もほぼ一致しており、extens\superを通じて
extens
	class Cat {
	    name: string;//  
	    constructor(name: string) {//          
	        this.name = name;
	    }
	    say(): void {//  
	        console.log(this.name)
	    }
	}
	class Dog extends Cat{}
	let dog = new Dog('mimi');
	dog.say()
	//mimi
この例は,最も基本的な継承を示し,Docgは,Catベースから派生して,extendsキーワードを通じて.派生類は通常はサブクラスと呼ばれ、基本類は超類と呼ばれています.派生類は基質から属性と方法を継承した.突然このばかな犬は自分の考えがあって、事はそんなに簡単ではありませんでした.
	class Cat {
	    name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say(): void {
	        console.log(this.name)
	    }
	}
	class Dog extends Cat{
	    dosth:string
	    constructor(dosth: string){
	        this.dosth = dosth
	    };
	}
この部分はコンパイルさえ必要ないです.書いている時にエディタは大きな切符で中国が赤くなりました.そして私達の派生類の構造関数はsuperを含めなければならないとヒントを与えました.
スーパー
	class Cat {
	    name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say(): void {
	        console.log(this.name)
	    }
	}
	class Dog extends Cat{
	    dosth:string
	    constructor(name:string,dosth: string){
	        super(name)
	        this.dosth = dosth
	    };
	    justdoit():void{
	        console.log(this.dosth)
	    }
	}
	let dog = new Dog('mimi', '   ')
	dog.say()		//mimi
	dog.justdoit()	//   
今回はヒントに従ってsuperのキーワードを入れました.mimiは順調にその壮挙を完成しました.ここのsuperは基本的な構造関数を表しています.
修飾子
ts属性を定義する時、公共のpublicが保護されているプロテッドプライベートのproviteです.
公共public
デフォルトはpublicで、クラス内、派生類、類以外はすべて訪問できるという意味です.
上記の例では、catの属性に自由にアクセスできます.tsメンバーは全部publicです.
	class Cat {
	    public name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say(){console.log(this.name)}
	}
	class cat1 extends Cat();
	let cat = new Cat('xiaobai')
	let cat1 = new Cat('dahuang')
	cat.name;
	cat.say();
	cat1.name;
	cat1.say();
	//           
私有のprvate
クラスの中で訪問できます.派生類、類以外は訪問できません.
	class Cat {
	    public name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say(){console.log(this.name)}
	}
	class cat1 extends Cat();
	let cat = new Cat('xiaobai')
	let cat1 = new Cat('dahuang')
	cat.name;		//error
	cat.say();		//fine
	cat1.name;		//error
	cat1.say();		//error
保護されたprotected
クラスの中、派生類の中で訪問することができます.類外ではアクセスできません.
	class Cat {
	    protected name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say(){console.log(this.name)}
	}	    
    class Cat1 extends Cat { };
	let cat1 = new Cat1('dahuang');
    cat1.say();			//fine
    cat1.name1			//error
    let cat = new Cat('xiaobai');
    cat.say()			//fine
    cat.name;			//error
リードオンリーreadonly
紙の表面は読み取り専用ですか?これは実は公式サイトの文書の意味がよく分かりません.大体吸収したのは読み取り専用の属性は声明の時や構造関数の中で初期化されなければなりません.
	class Cat {
	    readonly name: string;
	    constructor(name: string) {
	        this.name = name;
	    };
	    say() { console.log(this.name) }
	}
いくつかの修饰符については同じです.
	class Cat {
	    constructor(public name: string) {};
	    say() { console.log(this.name) }
	}
静的属性静的方法static
静的属性は、例示的なオブジェクトではなく、直接にクラス自体が存在します.s 5における静的方法と静的特性
	function cat(){ 
		this.say1 = function(){}	//    
	}
	cat.name = 'dahuang'			//    
	cat.say2 = function(){}			//    
	//    
	var p = new Cat();
	p.say1();
	Cat.say2()
tsに静的方法と属性を定義する
	class Cat{
		public name:string;
		static age:number = 2;
		constructor(name:string){
			this.name = name;
		}
		say(){		//    ,        
			console.log(this.name)
			console.log(this.age)//    this   error
			console.log(Cat.name)//      
		}
		static work(){//    ,          
			console.log('   ')
		}
	}
	Cat.say();//           
	Cat.work();//          
	console.log(Cat.age)//        
抽象類abstract
抽象類は他の派生類のベースとして使用されます.それらは通常直接的に実例化されない.インターフェースとは違って、抽象的なクラスはメンバーの実現の詳細を含むことができる.人間というのは多形の規範として、それらを含めなければならないと指定していますが、基本自体は実現しません.
	abstract class Cat {
		constructor(name:string='cat'){}
	    abstract say(): any;
	}
	let cat1 = new Cat()	//error            
	class Cat1 extends Cat{//fine
		say(){console.log('  ')}
	}
	class Cat2 extends Cat{//error   cat    say
		attck(){console.log('  ')}
	}