Назначение цепочки прототипов вызывает TypeError в Javascript - PullRequest
4 голосов
/ 14 июля 2020

Я изучаю наследование в JavaScript с использованием цепочки прототипов.

Вот код: https://jsfiddle.net/pnyf1ska/6/

// INHERITANCE USING JS

// SUPER CLASS CONSTRUCTOR
function bank () {
    this.cash = 1000;
}

// SUB CLASS CONSTRUCTOR
function thief () {
    // CALL BANK CONSTRUCTOR
    bank.call(this);
}

// ADD A METHOD TO BANK.PROTOTYPE
bank.prototype.steal = function () {
    console.log('a thief stole '+this.cash+' dollars!');
}

// THIEF EXTENDS BANK AND INHERITS STEAL METHOD.
//thief.prototype = bank.prototype;
// thief.prototype.__proto__ = bank.prototype // also works!
thief.prototype.__proto__.__proto__ = bank.prototype;  // why does this break?

let t = new thief();
t.steal();  // OUTPUT 1000.

Здесь thief.prototype.__proto__.__proto__ = bank.prototype прерывается и выводит ошибку:

"<a class='gotoLine' href='#47:37'>47:37</a> Uncaught TypeError: Immutable prototype object '#&lt;Object&gt;' cannot have their prototype set"

Поскольку thief.prototype.__proto__ = bank.prototype работает, я думал, что thief.prototype.__proto__.__proto__ = bank.prototype тоже подойдет.

Вы можете объяснить ошибку и как ее исправить? Спасибо.

1 Ответ

2 голосов
/ 14 июля 2020

Чтобы thief наследовал все методы и поля из bank, просто установите thief.prototype = bank.prototype. То, что вы сейчас используете, не имеет смысла; thief.prototype.__proto__ просто возвращает Object.prototype, а __proto__ из этого просто null (и не является доступным для записи свойством).

// INHERITANCE USING JS

// SUPER CLASS CONSTRUCTOR
function bank () {
    this.cash = 1000;
}

// SUB CLASS CONSTRUCTOR
function thief () {
    // CALL BANK CONSTRUCTOR
    bank.call(this);
}

// ADD A METHOD TO BANK.PROTOTYPE
bank.prototype.steal = function () {
    console.log('a thief stole '+this.cash+' dollars!');
}

thief.prototype = bank.prototype;

let t = new thief();
t.steal();  // OUTPUT 1000.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...