ES6用に以下を更新
2013年3月およびES5
このMDNドキュメントでは、クラスの拡張について詳しく説明しています。
https://developer.mozilla.org/en-US/docs/JavaScript/Introduction_to_Object-Oriented_JavaScript
特に、ここで彼らはそれを処理します:
// define the Person Class
function Person() {}
Person.prototype.walk = function(){
alert ('I am walking!');
};
Person.prototype.sayHello = function(){
alert ('hello');
};
// define the Student class
function Student() {
// Call the parent constructor
Person.call(this);
}
// inherit Person
Student.prototype = Object.create(Person.prototype);
// correct the constructor pointer because it points to Person
Student.prototype.constructor = Student;
// replace the sayHello method
Student.prototype.sayHello = function(){
alert('hi, I am a student');
}
// add sayGoodBye method
Student.prototype.sayGoodBye = function(){
alert('goodBye');
}
var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();
// check inheritance
alert(student1 instanceof Person); // true
alert(student1 instanceof Student); // true
Object.create()
IE8を含む一部の古いブラウザではサポートされていないことに注意してください。
これらをサポートする必要がある場合は、リンクされたMDNドキュメントで、ポリフィルまたは次の近似値を使用することをお勧めします。
function createObject(proto) {
function ctor() { }
ctor.prototype = proto;
return new ctor();
}
このようStudent.prototype = createObject(Person.prototype)
に使用new Person()
することは、プロトタイプを継承するときに親のコンストラクター関数を呼び出さないようにし、継承者のコンストラクターが呼び出されるときにのみ親コンストラクターを呼び出すという点で、使用するよりも望ましい方法です。
2017年5月およびES6
ありがたいことに、JavaScriptの設計者は私たちの助けを求める声を聞いており、この問題に取り組むためのより適切な方法を採用しています。
MDNには、ES6クラスの継承に関する別の優れた例がありますが、ES6で再現された上記とまったく同じクラスのセットを示します。
class Person {
sayHello() {
alert('hello');
}
walk() {
alert('I am walking!');
}
}
class Student extends Person {
sayGoodBye() {
alert('goodBye');
}
sayHello() {
alert('hi, I am a student');
}
}
var student1 = new Student();
student1.sayHello();
student1.walk();
student1.sayGoodBye();
// check inheritance
alert(student1 instanceof Person); // true
alert(student1 instanceof Student); // true
私たち全員が望むように、清潔で理解しやすい。ES6はかなり一般的ですが、どこでもサポートされているわけではないことに注意してください。