JavaScript вар против класса - PullRequest
0 голосов
/ 05 июля 2019

Это может звучать странно, учитывая, что переменные и классы - это совершенно разные вещи, но я родом из Java (в настоящее время степень бакалавра, студент 3-го курса), и я читаю на JavaScript и смотрю видео .

Видео об анимации в js началось со вступления к созданию vector объекта. Он определил vector в своем собственном файле с именем vector.js и использовал его в качестве основы для движения частиц в основных 2-мерных анимациях.

Вот код:

var vector = {
    _x: 1,
    _y: 0,

    create: function(x, y) {
        var obj = Object.create(this);
        obj.setX(x);
        obj.setY(y);
        return obj;
    },

    setX: function(value) {
        this._x = value;
    },
    getX: function() {
        return this._x;
    },

Продолжается большее число геттеров и сеттеров для угла, длины и т. Д. Также определяются методы для других векторных операций, таких как скрещивание и произведение точек.

Мои вопросы: -Как это отличается от использования класса с методами? -Это приемлемый / стандартный код? -Синтаксис foo: function(args) в качестве заголовка такой же, как function foo(args)? -Можете ли вы указать мне ресурсы, объясняющие концепцию наличия функций и параметров внутри, казалось бы, объявленной переменной?

Я пытался найти информацию о, но я не знаю, имеет ли этот синтаксис или использование имя в js. Я не видел ничего подобного в Java. Я не могу найти информацию.

Приветствие.

1 Ответ

2 голосов
/ 05 июля 2019

Это не класс. Это объект. В Java это похоже на анонимный класс. Так что в действительности Java обладает такой же функцией, но с другим синтаксисом. В Java это будет примерно так:

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

    // rest of code ... 
}

Единственное ключевое отличие состоит в том, что в отличие от Java, JavaScript не генерирует ошибок при доступе к свойствам несуществующего объекта. Приведенный выше код будет синтаксической ошибкой в ​​Java, поскольку класс Object не имеет членов x и y. Но 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 означает, что его часто используют вместо хэшей / карт / хеш-карт / ассоциативных массивов в других языках. Потому что он буквально ведет себя как ассоциативный массив. Так что, где в Java у вас есть Map в javascript, вы будете использовать {}.

...