为了账号安全,请及时绑定邮箱和手机立即绑定

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函数或类访问。然而,这个方法为每个类的实例都创建一个items变量的副本。因此,如果要创建多个Stack实例,它就不太适合了。ES6变量items却是公共的。ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。问题ES5说为每一个实例都创建了一个items变量副本,为何就说不适合创建多个Stack实例?但ES6用构造函数定义一个items,不也是相当于给每一个实例都创建了一个items变量吗??为何这就适合创建多个实例了?这跟ES5的那个items变量副本的优势在哪呢?(基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,这句话倒是明白的。)
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

因为书上是错的,应该是这样

  • ES5

在ES5中我们声明了一个私有的items变量,它只能被Stack函数或类访问。然而,这个方法为每个类的实例都创建push和pop方法的副本。因此,如果要创建多个Stack实例,它就不太适合了。

  • ES6

push和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


查看完整回答
反对 回复 2019-03-26
?
ITMISS

TA贡献1871条经验 获得超8个赞

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

查看完整回答
反对 回复 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 关注
  • 705 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信