Используя прототип, TypeError: task1.completed не является функцией - PullRequest
0 голосов
/ 09 октября 2018

Я следую учебному пособию по шаблону JS Design, в котором объясняется использование прототипа, чтобы мы не создавали новое «это» каждый раз, когда мы создаем объект.Однако, когда я запускаю код, как показано ниже, появляется сообщение об ошибке, как показано ниже.Я полностью следовал коду учебного пособия, поэтому я не понимаю, почему в учебном пособии нет ошибок.

TypeError: task1.completed не является функцией

    var Task = function (name) {
        this.name = name;
        this.completed = false;

    }

    Task.prototype.completed = function () {
        console.log('completing task: ' + this.name);
        this.completed = true;
    }


    Task.prototype.save = function () {
        console.log('saving task: ' + this.name);
    }

    var task1 = new Task('create a demo for constructors');
    var task2 = new Task('create a demo for modules');
    var task3 = new Task('create a demo for singletons');
    var task4 = new Task('create a demo for prototypes');

    task1.completed();
    task2.save();
    task3.save();
    task4.save();

Мой другой вопрос, как упоминалось в руководстве, мы всегда должны использовать этот способ для реализации класса,но почему я не видел этот шаблон во многих кодах?Я вижу только использование прототипа в реализации JS, встроенной в метонды, например.Object.prototype.toString ().Но в нашей реальной жизни я не видел это много.Разве я не знакомый код JS?

1 Ответ

0 голосов
/ 09 октября 2018

Переименуйте внутреннюю переменную экземпляра или функцию во что-то другое.Вы получаете конфликт пространства имен.Когда вы пишете:

Task.prototype.completed

Это похоже на запись

this.completed = ...

За исключением того, что прототип используется во всех вновь созданных объектах Task после объявления.Однако вы уже определили переменную экземпляра с именем this.completed.

Таким образом, если вы называете внутреннюю переменную экземпляра this._completed или что-то в этом духе, ваш код будет работать так, как вы ожидаете.

...