猿问

ES6的class跟直接function定义类的问题

是在某本书上看到的,然后产生了疑惑,代码如下:

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函数或类访问。然而,这个方法为每

个类的实例都创建一个items变量的副本。因此,如果要创建多个Stack实例,它就不太适合了。


ES6

变量items却是公共的。ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。


问题

ES5说为每一个实例都创建了一个items变量副本,为何就说不适合创建多个Stack实例?

但ES6用构造函数定义一个items,不也是相当于给每一个实例都创建了一个items变量吗??为何这就适合创建多个实例了?这跟ES5的那个items变量副本的优势在哪呢?

(基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,这句话倒是明白的。)


慕容3067478
浏览 706回答 3
3回答

慕尼黑的夜晚无繁华

因为书上是错的,应该是这样ES5在ES5中我们声明了一个私有的items变量,它只能被Stack函数或类访问。然而,这个方法为每个类的实例都创建push和pop方法的副本。因此,如果要创建多个Stack实例,它就不太适合了。ES6push和pop方法却是公共的。ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。而不是“item变量的副本”,item本来就是类成员,当然要创建item变量的副本。关键在于用函数实现的类(不改prototype)的每个对象的方法虽然功能和实现都是完全一致的,但它们都是不同的对象,都各自占有一定的内存空间,也就是说,使用函数实现类的话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

ITMISS

基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,这句话倒是明白的这句话你明白了 哪你为什么会有问题。。

繁星淼淼

我实在想不明白白这根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();    }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答