第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ES6的class跟直接function定義類的問題

ES6的class跟直接function定義類的問題

慕容3067478 2019-03-23 10:15:25
是在某本書上看到的,然后產生了疑惑,代碼如下:ES5的function定義類// 定義一個棧function Stack() {  let items = [];  this.push = function push(element) {    items.push(element);  };  this.pop = function pop() {    return items.pop();  };// 以下為其他棧方法}ES6的class定義類//定義一個棧class Stack {  constructor() {    this.items = [];  }  push(element) {    this.items.push(element);  }  pop() {    return this.items.pop();  }// 以下為其他棧方法}書上是這么解釋的:ES5在ES5中我們聲明了一個私有的items變量,它只能被Stack函數或類訪問。然而,這個方法為每個類的實例都創(chuàng)建一個items變量的副本。因此,如果要創(chuàng)建多個Stack實例,它就不太適合了。ES6變量items卻是公共的。ES6的類是基于原型的。雖然基于原型的類比基于函數的類更節(jié)省內存,也更適合創(chuàng)建多個實例,卻不能夠聲明私有屬性(變量)或方法。問題ES5說為每一個實例都創(chuàng)建了一個items變量副本,為何就說不適合創(chuàng)建多個Stack實例?但ES6用構造函數定義一個items,不也是相當于給每一個實例都創(chuàng)建了一個items變量嗎??為何這就適合創(chuàng)建多個實例了?這跟ES5的那個items變量副本的優(yōu)勢在哪呢?(基于原型的類比基于函數的類更節(jié)省內存,也更適合創(chuàng)建多個實例,這句話倒是明白的。)
查看完整描述

3 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

因為書上是錯的,應該是這樣

  • ES5

在ES5中我們聲明了一個私有的items變量,它只能被Stack函數或類訪問。然而,這個方法為每個類的實例都創(chuàng)建push和pop方法的副本。因此,如果要創(chuàng)建多個Stack實例,它就不太適合了。

  • ES6

push和pop方法卻是公共的。ES6的類是基于原型的。雖然基于原型的類比基于函數的類更節(jié)省內存,也更適合創(chuàng)建多個實例,卻不能夠聲明私有屬性(變量)或方法。

而不是“item變量的副本”,item本來就是類成員,當然要創(chuàng)建item變量的副本。

關鍵在于用函數實現(xiàn)的類(不改prototype)的每個對象的方法雖然功能和實現(xiàn)都是完全一致的,但它們都是不同的對象,都各自占有一定的內存空間,也就是說,使用函數實現(xiàn)類的話

var stackA = new Stack();

var stackB = new Stack();


console.log(stackA.push == stackB.push);  // false

而用原型的話,


var stackA = new Stack();

var stackB = new Stack();


console.log(stackA.push == stackB.push);  // true


查看完整回答
反對 回復 2019-03-26
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

基于原型的類比基于函數的類更節(jié)省內存,也更適合創(chuàng)建多個實例,這句話倒是明白的
這句話你明白了 哪你為什么會有問題。。

查看完整回答
反對 回復 2019-03-26
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

我實在想不明白白這根es5,es6有什么關系?


function Stack1() {

    let items = [];

    this.push = function push(element) {

        items.push(element);

    };

    this.pop = function pop() {

        return items.pop();

    };

}

class Stack2 {

    constructor() {

        let items = [];

        this.push = function push(element) {

            items.push(element);

        };

        this.pop = function pop() {

            return items.pop();

        };

    }

}

function Stack3() {

    this.items = [];

}

Stack3.prototype.push = function push(element) {

    this.items.push(element);

};

Stack3.prototype.pop = function pop() {

    return this.items.pop();

};

class Stack4 {

    constructor() {

        this.items = [];

    }

    push(element) {

        this.items.push(element);

    }

    pop() {

        return this.items.pop();

    }

}


查看完整回答
反對 回復 2019-03-26
  • 3 回答
  • 0 關注
  • 724 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號