1. 程式人生 > >js——class基礎

js——class基礎

{} 共享 poi 返回值 自身 pen tcl open type

js的類?其實還是原型!

1 class Point{
2     constructor(x, y){
3         this.x = x;
4         this.y = y;
5     }
6     toString(){
7         return ‘(‘ + this.x + ‘,‘ + this.y + ‘)‘;
8     }
9 }

基本點

1. class是關鍵字,class Point定義了一個“類”。其它變量名不能與類名相同

2. Point的類型(typeof):function,必須通過new來調用

  • class的pototype=>包含在class中所有定義的方法(包括constructor)
    Point.protoype;//
    {constructor: ?, toString: ?}

3. 與函數一樣,類也可以使用表達式的形式定義

  • var MyPoint = class{};
    var mypoint= new Mypoint();

    不會變量提升:必須先定義才可以使用class

  • name屬性(就像函數名),同樣的,class後的名稱只能在類內部使用
    MyPoint.name;//MyPoint
    var MyPoint2 = class me{};
    MyPoint2.name;//MyPoint2
    mypoint = new me();//報錯,me未定義,只能在類內部使用

4. constructor是構造函數

  • 通過new Point來實例化一個對象,且會自動調用class中的contructor
  • 返回值:默認返回實例對象this,可指定其它返回值(與es5相同)
  • 可省略?如果不顯式寫一個constructor,會自動添加一個空的(與C++相同)
  • Point.prototype.contructor是class,而不是contructor函數
  • var point = new Point();
    console.log(point.constructor===Point);//true

    constructor中的this指向實例化後的對象,與es5中的相同

    console.log(point);//
    Point {x: undefined, y: undefined}

5. 對象屬性的定義:在constructor中用this來添加; 對象方法的定義:在class中直接定義(不加function和逗號)

6. 在class中定義的方法不可枚舉

技術分享圖片
1 Object.keys(Point.prototype);//結果為空,說明不可枚舉
2 //es5中可枚舉
3 function Test(){}
4 Test.prototype.fun1 = function(){};
5 Object.keys(Test.prototype);//[fun1]可枚舉
View Code

7. 實例對象

  • 共享一個原型對象(與es5相同)
  • var p1 = new Point();
    var p2 = new Point();
    p1.__proto__ === p2.__proto__;//true

    原型對象的方法可直接在class中添加,那如果要添加屬性呢=>getPrototypeOf / Point.prototype上添加

    point.__proto__ === Point.prototype;//true
    var pProto = Object.getPrototypeOf(point);
    pProto.newAttr = 1;
    point.newAttr;//1

8. 靜態方法和屬性(static

  • 它們是屬於class,而不屬性實例(與C++相同)
  • 靜態屬性只能在class外由類來添加
  • class StaticClass{
        static constructor(){//定義一個靜態方法
            console.log(this);//class{...}
        }
        constructor(){
            console.log(this);//指向實例對象
        }
    }
    StaticClass.attr = 1;//定義一個靜態屬性

    靜態方法中的this指向的是class!

9. new的新屬性new.target

  • 函數或class通過new調用,那麽在它們內部使用new.target返回自身,否則返回undefined
  • 可以用於區分一個函數是否是通過new調用的
  • function Point1(){
        console.log("new.target結果:", new.target);
    }
    Point1();//undefined
    var p = new Point1();//function Point1(){...}

    在class中使用

    var targetClass = class me{
        constructor(){
            console.log(new.target===targetClass);//true
            console.log(new.target===me);//true
        }
    }
    var tclass = new targetClass();

js——class基礎