Зачем использовать функцию для создания структуры данных вместо класса? Это даже правильно? - PullRequest
1 голос
/ 26 апреля 2020

Я сравнил код, который нашел в Интернете, и то, что дал мне мой лектор. Меня смущает то, почему мой лектор использует функцию для создания структуры данных, а не класса, как я нашел в Интернете. Какой лучше? учебный класс? функция?

Это код моего лектора для создания стека

var Stack = function(){
    //Class members
    this.count = 0;
    this.storage = {};

    //Add item
    this.push = function(value){
        this.storage[this.count] = value;
        this.count++;
    }
    //Delete item
    this.pop = function(){
        if(this.count === 0){
            return undefined;
        }
        this.count--;
        var result = this.storage[this.count];
        delete this.storage[this.count];
        return result;
    }

    //Return the sie of the stack
    this.size = function(){
        return this.count;
    }

    //View the top of the stack
    this.top = function(){
        return this.storage[this.count-1];
    }
}

Это код моего лектора для создания связного списка

function Queue(){
    this.collection = [];

    //Print the collection
    this.print = function(){
        document.write(this.collection + "<br/>");
    };

    //Add item in queue
    this.addQ = function(element){
        this.collection.push(element);
    };

    //Remove item at the front
    this.deQ = function(){
        return this.collection.shift(); //Left shift
    };

    //Return first item
    this.front = function(){
        return this.collection[0];
    };

    //Return the size of queue
    this.size = function(){
        return this.collection.length;
    };

    //Check the queue status: Empty or not
    this.isEmpty = function(){
        return (this.collection.length === 0);
    };
}

Всего несколько вопросы

  1. зачем использовать функцию вместо класса?

  2. зачем использовать var Stack = function(){ для стека и function Queue(){ для очереди? отличается?

  3. зачем использовать this.push = function(value){? я думал, что это должно быть как function push(){

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Javascript является языком на основе прототипов, поэтому он не имеет реальных классов. Тем не менее, ES6 добавил ключевое слово class, которое легче читать, но все еще использует прототипы.

Все в javascript - это объект, включая функции. Когда вы вызываете функцию с помощью ключевого слова new, она создает новый объект и присоединяет его к this внутри этой функции. Таким образом, в вашем конструкторе вы можете сделать this.foo = function(){, чтобы прикрепить функцию к вашему новому объекту. Однако это неэффективно, поскольку выполняется каждый раз, когда вы создаете новый объект. Лучше использовать прототипы, чтобы каждая функция создавалась только один раз:

var Stack = function() {
    // Initialize local variables.
    this.count = 0;
    this.storage = {};
}

// Attach class methods
Stack.prototype.foo = function() { ... }
Stack.prototype.bar = function() { ... }

// Create instance of class.
var myStack = new Stack();

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

0 голосов
/ 26 апреля 2020

Прежде всего, нет никакой разницы в двух использованных способах, они работают одинаково. Также this.push = function(value){ ... } - это способ определения методов в Javascript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...