web-dev-qa-db-ja.com

Javascriptの「継承」とは何ですか?

JavaScriptでの「inheritance」の意味を簡単な言葉で説明してもらえますか?

22
Dima

簡単に言えば、継承とは、あるものが他の何かの特性や振る舞いを獲得するという概念です。 A inherits from Bとは、A is of of B. A Bird inherits from Animal due to a Bird 動物の一種です-同じことを行うことができますが、もう少し(または異なる方法で)!

JavaScriptでは、この関係を指定するのは少し複雑ですが、構文には関係があります。 Animalなどのtypeにプロパティを割り当てるprototypeという特別なオブジェクトを使用する必要があります。 functionsだけがprototypeを持っているので、最初に関数を作成する必要があります。

_function Animal() {}; // This is the Animal *Type*
Animal.prototype.eat = function () {
    alert("All animals can eat!");
};
_

ここで、Animalから継承するtypeを作成するには、prototypeオブジェクトも使用しますが、今回は、一方が他方に属するtypeです。鳥:

_function Bird() {}; // Declaring a Bird *Type*
Bird.prototype = new Animal(); // Birds inherit from Animal
Bird.prototype.fly = function() {
    alert("Birds are special, they can fly!");
};
_

これにより、作成したBirds(Birdのインスタンスと呼ばれる)はすべてAnimalsのプロパティを持ちますが、追加の.fly()

_var aBird = new Bird(); // Create an instance of the Bird Type
aBird.eat(); // It should alert, so the inheritance worked
aBird.fly(); // Important part of inheritance, Bird is also different to Animal

var anAnimal = new Animal(); // Let's check an instance of Animal now
anAnimal.eat(); // Alerts, no problem here
anAnimal.fly(); // Error will occur, since only Birds have fly() in its prototype
_
56
David Tang

Javascriptの継承に関するRobertによる素晴らしい説明 ここ

JavaScriptで継承が機能する方法は、class-basedではなくprototypeであるということです。

たとえば

function Being () {
    this.living = true;
}
Being.prototype.breathes = function () {
    return true;  

存在を継承するオブジェクト

Robert.prototype = new Being;
function Robert () {
    this.blogs = true;
}
Robert.prototype.getsBored = function () {
    return "You betcha";
};  

したがって、基本的に、Robertオブジェクトの新しいインスタンスを作成し、そのメソッドのいくつかを呼び出すと、結果は次のようになります。

// Create an instance of the Robert object
var me = new Robert();

/*
    Returns "You betcha" as it's a method
    belonging to the Robert object
*/
me.getsBored();

/*
    Returns true. Since the Robert object
    doesn't have a breathes method of
    its own, it goes back in the
    prototype chain to its parent
    object, Being, and finds the
    method there
*/
me.breathes();  

また、JavaScriptの継承についてもよく読んでください: JavaScriptの継承

13
sgokhales

ロバートは、「継承」がJSで何も異なることを意味しないということは正しいですが、他の多くの言語とは異なる方法で実装されています。オブジェクトまたはクラスが別のオブジェクトまたはクラスから継承すると言うことは、メンバー(属性、動作)を親で定義できるが、子を介してアクセスできることを意味します。 「メンバー」の意味を尋ねる前に、オブジェクトは 集約型 (別名 複合型 )であり、メンバーはコンポーネントです。

JSは元々 プロトタイプベースの継承 で設計されました。ここで、親はオブジェクトですが、クラスベースの継承(ある種の)はさまざまな方法で靴べらにすることができます。クラス(したがってクラスの継承)は、後で追加される可能性があります ECMAScript 標準。これは、ActionScriptなどの他の言語とともにJSを定義する標準です。 ActionScriptはすでにクラスをサポートしています。

「継承」と密接に関連しているのは「拡張」であり、子がメンバーを追加またはオーバーライドすることによって親を拡張します。

1
outis

次のように、別のjavascriptオブジェクトからプロパティを継承できるのは簡単です。

var a = function () {}
a.prototype.sayHello = function () { alert('hello') }

var b = function () {}
b.prototype = new a();

var c = new b();
c.sayHello(); // Alerts "hello"

JQueryのJohnResigには、それに関する優れたガイドがあります http://ejohn.org/apps/learn/ 継承について http://ejohn.org/apps/learn/#76

[〜#〜]編集[〜#〜]Robertsのコメントに基づいてコードを更新しました。

0
fredrik

JavaScriptでの継承の意味は、他のオブジェクト指向言語と同じです。

継承された子は、親の動作(状態の可能性と機能)を継承します。もちろん、これらの子は追加の動作を追加したり、既存のものをオーバーライドしたりできます。この点で、JavaScriptの継承は他の継承とまったく同じです。

それは、できるだけ簡単な言葉での意味についてです。ただし、JavaScriptで継承がどのように実装されているかについては、まったく別の話(および質問)になるため、質問しませんでした。その場合、クラスとプロトタイプ(JavaScriptで使用される)の違いを説明する必要があります。

0
Robert Koritnik

その単純な継承とは、次のことを意味します。"オブジェクト/クラスは他のオブジェクト/クラスから継承します"プロトタイプを介して

例:

function Person(first, last, age, eyecolor) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eyecolor;
}
Person.prototype.nationality = "English";
0
Rizo