当前位置: 首页 > 面试题库 >

es6类只是javascript中原型模式的语法糖吗?

萧永长
2023-03-14
问题内容

在玩完ES6之后,我真的开始喜欢可用的新语法和功能,但是我确实对类有疑问。

新的ES6类只是旧原型模式的语法糖吗?还是幕后还有更多事情要做?即:

class Thing {
   //... classy stuff
  doStuff(){}
}

vs:

var Thing = function() {
  // ... setup stuff
};

Thing.prototype.doStuff = function() {}; // etc

问题答案:

是的,也许,但是一些语法糖有牙齿。

声明一个类将创建一个函数对象,该函数对象是该类的构造函数,并使用constructor在类主体内提供的代码以及与该类同名的命名类。

类构造函数具有一个普通的原型对象,类实例以常规的JavaScript方式从该对象继承属性。在类主体中定义的实例方法将添加到此原型中。

ES6没有提供在类体内声明要存储在原型上并继承的类实例默认属性值(即,不是方法的值)的方法。要初始化实例值,可以将它们设置为构造函数内的局部非继承属性,也可以prototype按照与普通构造函数相同的方式,将它们手动添加到类定义之外的类构造函数的对象中。(我不是在争论为JavaScript类设置继承属性的优点或其他问题)。

在类主体中声明的静态方法将添加为类构造函数的属性。避免使用静态类的方法名称与继承了标准功能属性和方法竞争Function.prototype,例如callapplylength

不太麻烦的是,类声明和方法始终在严格模式下执行,并且该功能很少引起注意:.prototype类构造函数的属性是只读的:您无法将其设置为为某些特殊功能而创建的其他对象目的。

扩展类时会发生一些有趣的事情:

  • prototype扩展类构造函数的object属性自动在prototype要扩展的类的对象上原型化。这并不是特别新颖,可以使用来复制效果Object.create

  • 扩展类的构造函数(对象)会自动原型化在要扩展的类的构造函数上,而不是Function。尽管使用Object.setPrototypeOf甚至可以复制对普通构造函数的影响childClass.__proto__ = parentClass,但这将是一种非常不寻常的编码实践,并且在JavaScript文档中经常建议不要这样做。

还有其他区别,例如,类对象未按使用function关键字声明的命名函数的方式进行吊起。

我认为认为类声明和表达式在所有将来的ECMA
Script版本中保持不变不会太天真,并且看看是否以及何时进行开发会很有趣。可以说,将“语法糖”与ES6(ECMA-262标准版本6)中引入的类相关联已经成为一种时尚,但是我个人试图避免重复它。



 类似资料:
  • 本文向大家介绍JavaScript设计模式之原型模式分析【ES5与ES6】,包括了JavaScript设计模式之原型模式分析【ES5与ES6】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript设计模式之原型模式。分享给大家供大家参考,具体如下: 从设计模式的角度讲,原型模式是用于创建对象的一种模式,若需要创建一个对象,一种方法是先指定其类型,然后通过类来创建这个对象,另一

  • 本文向大家介绍详解es6超好用的语法糖Decorator,包括了详解es6超好用的语法糖Decorator的使用技巧和注意事项,需要的朋友参考一下 Decorator(修饰器/装饰器)是es6提出的语法糖,用于修改类的行为。不过目前主流浏览器都没有很好的支持,我们需要用babel来转换为浏览器能识别的语言。在这篇文章中将介绍decorator的基础用法和一些应用实例。 1.修饰类 (1) 基础用法

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,ShapeCache.java,PrototypePatternDemo.java原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的

  • 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据

  • 原型模式是创建型模式的一种,其特点在于通过「复制」一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的「原型」,这个原型是可定制的。 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。 将构造函数模式中的示例稍作改造,用 prototype 实现成员方法: function Family

  • 简介 原型模式是创建型模式的一种,其特点在于通过「复制」一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的「原型」,这个原型是可定制的。 原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。 Prototype原型模式是一种创建型设计模式,它主要面对的问题是:“某些结构复杂的对象”的创建