javascript - 就 JavaScript 引擎而言,实现原型委托而不是基于类的继承是否有好处?
问题描述
查看带有类的现代 JavaScript,我的理解是,这都是覆盖在 ECMAScript2015 之前使用的基于原型的相同对象模型的所有语法糖。我喜欢直接使用原型链,但类肯定更容易。
所以在我看来,在 JavaScript 中,程序很可能都根据基于类的语法指定,但很可能根据原型对象的规则执行。因此,在 JavaScript 的编写方式和执行方式之间总是需要进行某种转换。
不管 JavaScript 是如何通过浏览器和其他引擎实现的,我的问题是:
从编写 JavaScript 引擎的角度来看,在原型委托而不是类方面实现面向对象的语言是否有性能或其他好处?
==== 编辑
一个类似的问题(基于原型的语言的 Hidden-class implementation)有评论表明传统意义上的类更容易在编译器级别实现,因为它们可以静态布局在内存中(我认为无论如何都是隐含的),但是这不允许动态结构,例如 JavaScript 允许的。所以在我看来,原型委托可能非常适合在编译器级别实现动态对象?
解决方案
另一个角度是对象组合。
考虑一下:
class X { method() {} }
class Y extends X { method2() {} }
const y = new Y();
现在,在“经典”OOP 中,y
它将是一个对象,它有两个方法,method
并且method2
.
在原型(经典 JavaScript)意义上,y
是一个对象。该对象本身没有任何东西,但在它的原型上,它有一个method2
. 第一个在哪里method
?好吧,如果你深入挖掘原型的构造函数,你会发现它也有一个原型,其中method
有一部分。
从节点 REPL 复制粘贴:
> class X { method() {} }
undefined
> class Y extends X { method2() {} }
undefined
> const y = new Y();
undefined
> y
Y {}
> y.prototype
undefined
> y.__proto__
Y {}
> y.__proto__.constructor
[Function: Y]
> y.__proto__.constructor.__proto__
[Function: X]
你需要能够支持那些对事物原型进行猴子补丁的人:
> X.prototype.method = () => console.log('I am here now!');
[Function]
> y.method();
I am here now!
推荐阅读
- mysql - django queryset union 不能仅使用
- html - 为什么这些单选按钮没有显示?如何使它们可见?
- c++ - 如何更改结构的字节顺序?
- node.js - 有没有办法在Javascript中的Tensorflow手势模型中找到手到相机的距离?
- sql - AWS Glue 作业失败,错误日志为空
- javascript - 如何在不渲染的情况下获取 vue 组件的 DOM?
- php - 我可以在使用 jquery ajax 的表单提交上同时调用同一个 php 页面上的方法以及另一个 php 代码中的方法吗?
- python - 带有 ModelSelect2Widget 的 AttributeError
- sql - SQL查询查找2020年1月连续3天购物的客户数量
- php - 尽管存在 PHP 文件名/路径无效