首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >js“类”与经典类

问js“类”与经典类
EN

Stack Overflow用户
提问于 2014-11-21 21:36:43
回答 2查看 1.7K关注 0票数 3

我问了以下问题,为什么在js:class use in a prototypal inheritance-based language这样的典型的无类原型继承语言中使用类?

似乎他们是“合成糖”因为大众喜欢阶级..。它们只是背景中的普通js对象。

现在我想知道js假“类”和经典类之间的区别是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 22:16:36

如果我将JS“类”与Java中的类进行比较,我首先要说的是,JS“类”只是一个对象,而类不是。

对象有自己的属性/字段/方法。这也是JS“类”可以拥有的。但是Java 中的类不能,只有实例可以。

有些人可能会说:“等等,但是静态字段和方法如何?我可以做一个静态MyClass.myField字段-- MyClass.doSomething()方法。”

可以,停那儿吧。但从我的观点来看,它们只是“放置”在MyClass命名空间中,它们并不是类的真正属性:

  • 静态方法中没有this,但是可以在JS“类”中的类级方法中使用this。
  • 您不能使用静态方法创建类来实现特定的接口--假设鸭子类型为接口--这在JS中没有问题。

因此,带有静态字段或方法的Java类只是这些字段和方法的名称空间,仅此而已。更明显的是,在静态方法中,您无法找出您所在的类(没有技巧):

Getting the class name from a static method in Java

因此,在JS中,伪类是一流对象,而在Java中则不是。

票数 5
EN

Stack Overflow用户

发布于 2014-11-21 22:23:15

我可以这样想,在类继承中,父对象被锁定。例如:

代码语言:javascript
复制
class A
{
};

class B extends A
{
};

在这里,A的定义被锁定,一旦它被继承,您就不能添加新的属性。

在Javascript的“类”中,您可以:

代码语言:javascript
复制
var o = {x:2};
var b = Object.create(o);
o.y = 5;
b.y
>5

您知道我们是如何在“继承”之后添加属性的吗?这是一个不同之处,对象并不是真正的锁定(虽然您可以使用Object.preventExtensions、Object.seal、Object.freeze来锁定对象),但是它们本身可以在任何时候修改对象,并且到原型对象的链接是在子对象中维护的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27070783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档