【问题标题】:JavaScript var vs classJavaScript 变量与类
【发布时间】:2019-11-15 16:31:47
【问题描述】:

这听起来像是一个奇怪的问题,考虑到变量和类是完全不同的东西,但我来自 Java 背景(目前是副学士学位,三年级大学生),我一直在阅读 javascript 和观看视频.

关于 js 动画的视频以创建 vector 对象的介绍开始。他在自己的名为vector.js 的文件中定义了vector,并将其用作基本二维动画中粒子运动的基础。

代码如下:

变量向量 = { _x: 1, _y: 0, 创建:函数(x,y){ var obj = Object.create(this); obj.setX(x); obj.setY(y); 返回对象; }, setX:函数(值){ this._x = 值; }, 获取X:函数(){ 返回这个._x; },

它继续为角度、长度等提供更多的 getter 和 setter。还定义了其他矢量运算的方法,例如交叉和点积。

我的问题是: - 这与使用带有方法的类有什么不同? - 这是可接受的/标准代码吗? -作为标题的语法foo: function(args)是否与function foo(args)相同? -你们都可以指点我解释在看似声明的变量中包含函数和参数的概念的资源吗?

我已经尝试查找有关的信息,但我不知道这种语法或用法在 js 中是否有名称。我在 Java 中没有见过这样的东西。我找不到任何信息。

干杯。

【问题讨论】:

标签: javascript class oop syntax var


【解决方案1】:

那不是一门课。那是一个对象。在 Java 中,它就像一个匿名类。因此,Java 实际上确实具有完全相同的功能,但语法不同。在 Java 中会是这样的:

Object vector = new Object {
    private Integer x = 0;
    private Integer y = 0;

    // rest of code ... 
}

一个关键的区别在于,与 Java 不同的是,当您访问不存在的对象的属性时,javascript 不会产生错误。上面的代码在 Java 中会出现语法错误,因为 Object 类没有成员 xy。但是javascript会默默添加不存在的成员:

class Foo {
    constructor () {
        this.a = 1;
    }
}

var foo = new Foo();
console.log(foo.a); // prints 1
console.log(foo.b); // prints "undefined"
foo.b = 2;          // NOT an error
console.log(foo.b); // prints 2

在 javascript 中,语法 {} 等价于 new Object()。这称为object literal 语法(技术上它被指定为“对象初始化器”)。这实际上是 JSON 的由来——它基于 javascript 对象和数组语法。

javascript 中对象的这种行为意味着它经常被用来代替其他语言中的 hashes/maps/hashmaps/associative arrays。因为它实际上表现得像一个关联数组。所以在 Java 中你有 Map 在 JavaScript 中你会使用 {}

【讨论】:

  • 所以它只是对象的一个​​实例?该视频一次使用了多个向量。
  • 它是一个单一的实例,但它也有一个方法create,它可以创建更多以它为原型的对象,这意味着vector.create创建的对象也可以访问所有方法向量。它基本上是一个类,但有很多方法可以在 JavaScript 中创建它们。
  • @Josh 如果您开始学习 javascript,我建议您首先忽略原型机制,因为它很快就会变得混乱。相反,首先要了解对象的行为方式和新的 class 语法并熟悉该语言 - 然后深入研究原型继承的血腥细节
  • @slebetman 这是有道理的。但是你能解释一下方法声明的区别吗?
  • @Josh 刚刚了解了函数表达式。您在那里看到的是将函数分配给对象的属性。见:developer.mozilla.org/en-US/docs/web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多