2016-10-15 10 views
1

私はjavascriptプログラミングの初心者です。最近、私はJavaScriptの旅で私を混乱させる問題に遭遇します。 Person()コンストラクタからすべてのメンバーを継承するTeacher()コンストラクタを作成したいと思います。1つのコンストラクタのプロトタイププロパティを元のプロトタイププロパティに継承させるにはどうすればよいですか?

まず、私は第二

function Person(name) { 
     this.name = name; 
    }; 

    Person.prototype.greeting = function() { 
     alert('Hi! I\'m ' + this.name + '.'); 
    }; 

を以下のように私は)人(から教師を()の作成)(人を作成します。ここで

function Teacher(name){ 
     Person.call(this,name); 
    }; 

が問題です:私は先生()のプロトタイプを設定しようとすると

、それは次の二つの慣行が同じように見えることを私に混乱しました。しかし、彼らはいくつかの違いを持っ​​ている必要があります、と思います。 私が最初に次のように書いている:

Teacher.prototype = Object.create(Person.prototype); 

を私は上記のように書いた後、私はTeacher.prototypeが間違っていることが証明Person.prototype、に等しいことだと思う:

Teacher.prototype === Person.prototype;//=>false 

しかし、teacherAを、教師のインスタンスは()、成功した)(人から挨拶メソッドを継承します

var teacherA = new Teacher(); 
    teacherA.name = 'Kyle'; 
    teacherA.greeting();//=>Hi!I'm Kyle. 

その後、私は先生()のプロトタイププロパティEQUを作っている、次のように私のコードを変更しようとしました人()のprototypeプロパティにアル:確かに

Teacher.prototype = Person.prototype; 
    Teacher.prototype === Person.prototype;//=>true 

、teacherB、教師の別のインスタンスは、()、同様)(人から挨拶メソッドを継承します

var teacherB = new Teacher(); 
    teacherB.name = 'Jane'; 
    teacherB.greeting();//=>Hi!I'm Jane. 

誰もがなぜ私に言うことができますこれらの2つのプラクティスはどちらも正常に継承されましたが、2つの状況のうちの1つでは、Teacher.prototypeはPerson.prototypeと等しくなく、別の状況では逆です。ありがとう!

答えて

0

私は上記のように書いた後、私はあなたがObject.createを使用するとき、それはして新しいオブジェクトを作成するためTeacher.prototypeは、はい

間違っていることが証明 Person.prototype、に等しいことだと思いますプロトタイプは Person.prototypeです。 (

Teacher.prototype -> middle.__proto__ -> Person.prototype 

しかし、teacherA、教師()のインスタンスは、人から挨拶方法 を継承しますので、結果としてプロトタイプチェーンは、このようなものです

var mediator = {}; 
Object.setPrototypeOf(mediator, Person.prototype); 
Teacher.prototype = mediator 

:これは、何が起こるかの一種であります)正常に:

Person.prototypeの上に示したように、私はまだTeacher.prototypeに到達することができます。

それから私は、S「)人(に等しいの プロトタイププロパティ」先生を()作られ、次のように私のコードを変更するにはprototypeプロパティを試してみました:

ますので、これは、行われるべきではありませんPersonからアクセスできないはずのTeacherプロトタイプにメソッドを追加したいかもしれません。しかし、そうすることで、Teacherプロトタイプにメソッドを追加すると、それはPersonのインスタンスからアクセス可能になります。したがって、それを行った後:

Teacher.prototype = Person.prototype; 

var teacher = new Teacher(); 
var person = new Person(); 

// let's add method to child Person 
Person.prototype.childMethod = function() {}; 

// the parent can still access it 
person.childMethod(); // works OK 
+0

あなたの答えは本当に有益です。私が学ぶときにこれを念頭に置いておくことは、私が確かに継承をよりよく理解できるようにするでしょう。どうもありがとうございます。 –

+0

あなたが書いたときに言及する価値があるかもしれません: –

関連する問題