91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

es6的class是不是函數

發布時間:2022-04-11 15:17:32 來源:億速云 閱讀:171 作者:iii 欄目:web開發

本篇內容介紹了“es6的class是不是函數”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

es6 class是函數。在es6中,class(類)作為對象的模板被引入,可以通過class關鍵字定義類,語法為“class 類名{...};class的本質就是function(函數),它是一個語法糖,其底層是通過“構造函數”去創建的。

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

es6 class是函數。

在ES6中,class (類)作為對象的模板被引入,可以通過 class 關鍵字定義類。

class 的本質是 function。

它可以看作一個語法糖,其底層還是通過 構造函數 去創建的,讓對象原型的寫法更加清晰、更像面向對象編程的語法。

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function() {
    return this.name;
}

const xiaoming = new Person('小明', 18);
console.log(xiaoming);

上面代碼用ES6的class實現,就是下面這樣

class Person {
    constructor(name, age) {
      this.name = name;
      this.age = age;
    }
  
    sayName() {
      return this.name;
    }
}
const xiaoming = new Person('小明', 18)
console.log(xiaoming);
// { name: '小明', age: 18 }

console.log((typeof Person));
// function
console.log(Person === Person.prototype.constructor);
// true

constructor方法,這就是構造方法,this關鍵字代表實例對象。 類的數據類型就是函數,類本身就指向構造函數。

定義類的時候,前面不需要加 function, 而且方法之間不需要逗號分隔,加了會報錯。

類的所有方法都定義在類的prototype屬性上面。

class A {
    constructor() {}
    toString() {}
    toValue() {}
}
// 等同于
function A () {
    // constructor
};
A.prototype.toString = function() {};
A.prototype.toValue = function() {};

在類的實例上面調用方法,其實就是調用原型上的方法。

let a = new A();
a.constructor === A.prototype.constructor // true

類的實例

實例的屬性除非顯式定義在其本身(即定義在this對象上),否則都是定義在原型上(即定義在class上)。

注意:

1、class不存在變量提升

new A(); // ReferenceError
class A {}

因為 ES6 不會把類的聲明提升到代碼頭部。這種規定的原因與繼承有關,必須保證子類在父類之后定義。

{
  let A = class {};
  class B extends A {}
}

上面的代碼不會報錯,因為 B繼承 A的時候,A已經有了定義。但是,如果存在 class提升,上面代碼就會報錯,因為 class 會被提升到代碼頭部,而let命令是不提升的,所以導致 B 繼承 A 的時候,Foo還沒有定義。

2、this的指向 類的方法內部如果含有this,它默認指向類的實例。但是,必須非常小心,一旦單獨使用該方法,很可能報錯。

繼承

Class 可以通過extends關鍵字實現繼承

class Animal {}
class Cat extends Animal { };

上面代碼中 定義了一個 Cat 類,該類通過 extends關鍵字,繼承了 Animal 類中所有的屬性和方法。 但是由于沒有部署任何代碼,所以這兩個類完全一樣,等于復制了一個Animal類。 下面,我們在Cat內部加上代碼。

class Cat extends Animal {
    constructor(name, age, color) {
        // 調用父類的constructor(name, age)
        super(name, age);
        this.color = color;
    }
    toString() {
        return this.color + ' ' + super.toString(); // 調用父類的toString()
    }
}

constructor方法和toString方法之中,都出現了super關鍵字,它在這里表示父類的構造函數,用來新建父類的this對象。

子類必須在 constructor 方法中調用 super 方法,否則新建實例就會報錯。 這是因為子類自己的this對象,必須先通過 父類的構造函數完成塑造,得到與父類同樣的實例屬性和方法,然后再對其進行加工,加上子類自己的實例屬性和方法。如果不調用super方法,子類就得不到this對象。

class Animal { /* ... */ }

class Cat extends Animal {
  constructor() {
  }
}

let cp = new Cat();
// ReferenceError

Cat 繼承了父類 Animal,但是它的構造函數沒有調用super方法,導致新建實例報錯。

如果子類沒有定義constructor方法,這個方法會被默認添加,代碼如下。也就是說,不管有沒有顯式定義,任何一個子類都有constructor方法。

class Cat extends Animal {

}
// 等同于

class Cat extends Animal {
    constructor(...args) {
        super(...args);
    }
}

另一個需要注意的地方是,es5 的構造函數在調用父構造函數前可以訪問 this, 但 es6 的構造函數在調用父構造函數(即 super)前不能訪問 this。

class A {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}

class B extends A {
  constructor(x, y, name) {
    this.name = name; // ReferenceError
    super(x, y);
    this.name = name; // 正確
  }
}

上面代碼中,子類的constructor方法沒有調用super之前,就使用this關鍵字,結果報錯,而放在super方法之后就是正確的。

父類的靜態方法,也會被子類繼承。

class A {
  static hello() {
    console.log('hello world');
  }
}

class B extends A {
}

B.hello()  // hello world

“es6的class是不是函數”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

栾城县| 建水县| 长顺县| 肃宁县| 巨鹿县| 贡山| 西安市| 三原县| 乌鲁木齐市| 平舆县| 丽水市| 高雄县| 田东县| 基隆市| 望城县| 谢通门县| 闽清县| 西充县| 北宁市| 沾化县| 黄平县| 涞水县| 南阳市| 饶平县| 石渠县| 手机| 扎鲁特旗| 黄平县| 罗定市| 甘谷县| 拉萨市| 铜川市| 湘潭市| 余姚市| 徐州市| 喀喇沁旗| 灯塔市| 天水市| 嵊州市| 福安市| 民丰县|