freeCodeCamp/curriculum/challenges/japanese/02-javascript-algorithms-an.../object-oriented-programming/add-methods-after-inheritan...

4.1 KiB

id title challengeType forumTopicId dashedName
587d7db1367417b2b2512b87 継承した後にメソッドを追加する 1 301315 add-methods-after-inheritance

--description--

スーパータイプのコンストラクター関数から自身の prototype オブジェクトを継承するコンストラクター関数は、継承されるメソッドに加えて独自のメソッドを持つこともできます。

たとえば、Bird は、自身の prototypeAnimal から継承するコンストラクターです。

function Animal() { }
Animal.prototype.eat = function() {
  console.log("nom nom nom");
};
function Bird() { }
Bird.prototype = Object.create(Animal.prototype);
Bird.prototype.constructor = Bird;

Animal から継承される内容に加えて、Bird オブジェクトに固有の動作を追加することができます。 次の例では、Birdfly() 関数を取得します。 関数は、他のコンストラクター関数と同じ方法で Birdprototype に追加されます。

Bird.prototype.fly = function() {
  console.log("I'm flying!");
};

これで、Bird のインスタンスで eat()fly() の両方のメソッドを使用できます。

let duck = new Bird();
duck.eat();
duck.fly();

duck.eat() はコンソールに文字列 nom nom nom を表示し、duck.fly() は文字列 I'm flying! を表示します。

--instructions--

Dog オブジェクトが Animal から継承され、Dogprototype コンストラクターが Dog に設定されるように、必要なコードをすべて追加してください。 そして、bark() メソッドを Dog オブジェクトに追加して、beagleeat()bark() の両方を使用できるようにしてください。 bark() メソッドは Woof! をコンソールに出力する必要があります。

--hints--

Animalbark() メソッドに応答しない必要があります。

assert(typeof Animal.prototype.bark == 'undefined');

DogAnimal から eat() メソッドを継承する必要があります。

assert(typeof Dog.prototype.eat == 'function');

Dog プロトタイプは bark() メソッドを持つ必要があります。

assert('bark' in Dog.prototype);

beagleinstanceof Animal である必要があります。

assert(beagle instanceof Animal);

beagle のコンストラクターを Dog に設定する必要があります。

assert(beagle.constructor === Dog);

beagle.eat() は文字列 nom nom nom を出力する必要があります。

capture();
beagle.eat();
uncapture();
assert(logOutput == 'nom nom nom');

beagle.bark() は文字列 Woof! を出力する必要があります。

capture();
beagle.bark();
uncapture();
assert(logOutput == 'Woof!');

--seed--

--before-user-code--

var logOutput = "";
var originalConsole = console
function capture() {
    var nativeLog = console.log;
    console.log = function (message) {
        logOutput = message;
        if(nativeLog.apply) {
          nativeLog.apply(originalConsole, arguments);
        } else {
          var nativeMsg = Array.prototype.slice.apply(arguments).join(' ');
          nativeLog(nativeMsg);
        }
    };
}

function uncapture() {
  console.log = originalConsole.log;
}

capture();

--after-user-code--

uncapture();
(function() { return logOutput || "console.log never called"; })();

--seed-contents--

function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };

function Dog() { }

// Only change code below this line




// Only change code above this line

let beagle = new Dog();

--solutions--

function Animal() { }
Animal.prototype.eat = function() { console.log("nom nom nom"); };

function Dog() { }
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function () {
  console.log('Woof!');
};
let beagle = new Dog();

beagle.eat();
beagle.bark();