2016-05-26 12 views
1

私はJavaScriptオブジェクトのいくつかのメソッドを子クラスで継承できるようにしようとしていますが、親クラスのインスタンス化を許可したくありません。JavaScriptで抽象関数に機能を入れる方法

/** 
* Shows how basic abstraction works with JavaScript 
*/ 

//Define the person object with a first name, last name, and an age 
function Person(firstName, lastName, age) { 
    //Make it so that this object cannot be instantiated by identifying its constructor 
    if(this.constructor === Person) { 
     throw new Error("Can't instantiate an abstract class of type Person!"); 
    } 

    //Assign instance variables 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.age = age; 

    //Create simple get methods 
    this.getName = function(){ 
     return this.firstName + " " + this.lastName; 
    } 

    this.getFirstName = function() { 
     return this.firstName; 
    } 

    this.getLastName = function() { 
     return this.lastName; 
    } 

    this.getAge = function() { 
     return this.age; 
    } 
} 

//Define the student constructor 
function Student(firstName, lastName, age, subject) { 
    //Assign the instance variables including the new subject variable 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.age = age; 
    this.subject = subject; 

    //Add a new function to get the subject from Student 
    this.getSubject = function() { 
     return this.subject; 
    } 
} 
Student.prototype = Object.create(Person.prototype); 
Student.prototype.constructor = Student; 

//Testing the inheritance 
var joe = new Student("Joe", "Shmo", 33, "Computer Science"); 
console.log("First Name: " + joe.getFirstName()); //The getFirstName() function is defined in the superclass 
console.log("Subject: " + joe.getSubject()); //The getSubject() function is defined in the subclass 

学生対象のジョーにgetFirstNameを呼び出そうとするとき、私はエラーを取得し、このコードで:ここで私はこれを説明するために書いたいくつかのコードです。 getFirstNameにサブクラスが継承できるようにすると非常に便利なようです。

親クラスのgetName関数を定義して、Studentなどのサブクラスによって継承されたその機能を持つことができるようにしたいと思っています。それを行う方法はありますか?私は本当に助けていただければ幸いです!

+0

あなたが得る方法を必要といけません。すべてがjavascriptのオブジェクトなので、 'joe.firstName'を使うことができます。 http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/、https://developer.mozilla.org/en-US/docs/Web/JavaScript/をご覧ください。ガイド/ Working_with_Objects – Craicerjack

+0

コードのポイントはそれらの値を取得することではありませんでした。これは私がJavaScriptの抽象概念を理解できるように取り組んでいる別のプロジェクトのダミーコードです。私の実際のコードのこれらのメソッドはデータで動作します。私はちょうど親クラスからその関数を継承して、呼び出せるようにしたい。どうすればいいのか知っていますか? –

答えて

1

Personのインスタンスではなく、Personプロトタイプでメソッドを定義する必要があります。あなたはObject.create(Person.prototype)を行うとき、その方法は、彼らがコピーされます。

/** 
 
* Shows how basic abstraction works with JavaScript 
 
*/ 
 

 
//Define the person object with a first name, last name, and an age 
 
function Person(firstName, lastName, age) { 
 
    //Make it so that this object cannot be instantiated by identifying its constructor 
 
    if(this.constructor === Person) { 
 
     throw new Error("Can't instantiate an abstract class of type Person!"); 
 
    } 
 

 
    //Assign instance variables 
 
    this.firstName = firstName; 
 
    this.lastName = lastName; 
 
    this.age = age; 
 

 
} 
 

 
Person.prototype.getName = function(){ 
 
    return this.firstName + " " + this.lastName; 
 
} 
 

 
Person.prototype.getFirstName = function() { 
 
    return this.firstName; 
 
} 
 

 
Person.prototype.getLastName = function() { 
 
    return this.lastName; 
 
} 
 

 
Person.prototype.getAge = function() { 
 
    return this.age; 
 
} 
 

 
//Define the student constructor 
 
function Student(firstName, lastName, age, subject) { 
 
    //Assign the instance variables including the new subject variable 
 
    this.firstName = firstName; 
 
    this.lastName = lastName; 
 
    this.age = age; 
 
    this.subject = subject; 
 

 
    //Add a new function to get the subject from Student 
 
    this.getSubject = function() { 
 
     return this.subject; 
 
    } 
 
} 
 
Student.prototype = Object.create(Person.prototype); 
 
Student.prototype.constructor = Student; 
 

 
//Testing the inheritance 
 
var joe = new Student("Joe", "Shmo", 33, "Computer Science"); 
 
console.log("First Name: " + joe.getFirstName()); //The getFirstName() function is defined in the superclass 
 
console.log("Subject: " + joe.getSubject()); //The getSubject() function is defined in the subclass

+0

ここで変更した内容を確認していただき、ありがとうございます。人のプロトタイプでこれらの機能をどのように定義しているかが、私が行ったこととはどう違っているのかまだ分かりません。プロトタイプの目的は何ですか? –

+0

プロトタイプの方法で100000人の配列を作成すると、関数は1回だけ作成されます。コンストラクタからそれらを追加すると、それらはPerson内のオブジェクトの中に作成する関数に過ぎません。だから彼らは100000回創られました。ここでより良い説明です:http://stackoverflow.com/questions/9772307/declaring-javascript-object-method-in-constructor-function-vs-in-prototype/9772864#9772864。この方法では、オブジェクトの特定のインスタンスへのローカル関数なので、継承されません – juvian

+0

@NickPここでは、メソッドを使用する別の方法です:https://jsfiddle.net/o41ng2rn/ – juvian

関連する問題