js"班级"与经典课程

时间:2014-11-21 21:36:43

标签: javascript prototypal-inheritance

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

似乎它们是“合成糖”,因为群众喜欢类......而且它们只是背景中的常规js对象。

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

2 个答案:

答案 0 :(得分:2)

如果我比较JS"类"在Java课程中,我首先要说的是 JS" class"只是一个对象,而Java类不是

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

有些人可能会说"等等,但静态字段和方法怎么样?我可以使用MyClass.myField方法进行静态MyClass.doSomething()字段。"

是的,你可以。但从我的观点来看,他们只会被放置在#34;在MyClass命名空间中,它们不是该类的属性

  • 您在静态方法中没有this - 但您可以在JS"类"
  • 中的类级方法中使用this
  • 你不能用静态方法创建一个类来实现某个接口 - 假设鸭子类型为接口,这在JS中没有问题

因此,具有静态字段或方法的Java类只是这些字段和方法的命名空间,仅此而已。更明显的是,在静态方法中你无法找到你所属的课程(没有技巧):

  

Getting the class name from a static method in Java

因此在JS伪类中是第一类对象,而在Java中它们不是。

答案 1 :(得分:2)

我能想到这一点,在类继承中,父对象被锁定。例如:

class A
{
};

class B extends A
{
};

此处,A的定义已被锁定,一旦继承,就无法添加新属性。

在Javascript“课程”中,您可以:

var o = {x:2};
var b = Object.create(o);
o.y = 5;
b.y
>5

您是否看到我们在“继承”后添加了一个属性?这是一个区别,对象并没有真正锁定(尽管你可以通过使用Object.preventExtensions,Object.seal,Object.freeze来锁定对象),但是它们本身可以在任何时候修改对象这个原型对象的链接保存在子对象中。