2016-05-26 28 views
1

Ich versuche es so zu machen, dass ich einige Methoden in einem JavaScript-Objekt durch eine Kindklasse vererben lassen kann, aber ich möchte nicht zulassen, dass die Elternklasse instanziiert wird . Hier ist ein Code, den ich schrieb, dies zu veranschaulichen:Wie man Funktionalität in abstrakte Funktion in JavaScript einfügt

/** 
* 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 

Mit diesem Code, den ich eine Fehlermeldung erhalten, wenn sie versuchen getFirstName auf dem Student-Objekt joe zu nennen. Es scheint sehr nützlich zu sein, dass getFirstName von der Unterklasse geerbt werden kann.

Ich möchte wirklich die getName-Funktion in der Elternklasse definieren, so dass ich dann nur diese Funktionalität von den Unterklassen wie Student geerbt haben kann. Gibt es eine Möglichkeit, das zu tun? Ich würde wirklich jede Hilfe schätzen!

+0

Sie brauchen nicht Methoden zu erhalten. Da alles ein Objekt in Javascript ist, können Sie einfach 'joe.firstName' verwenden. Sehen Sie sich http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/ und https://developer.mozilla.org/en-US/docs/Web/JavaScript/ an. Guide/Working_with_Objects – Craicerjack

+0

Der Punkt des Codes war nicht, diese Werte zu bekommen. Dies ist Dummy-Code für ein anderes Projekt, an dem ich gerade arbeite, um die Abstraktion in JavaScript zu verstehen. Diese Methoden in meinem eigentlichen Code werden mit Daten arbeiten. Ich möchte nur sein, um diese Funktion von einer Elternklasse zu erben, so dass ich es anrufen kann. Weißt du, wie ich das machen könnte? –

Antwort

1

Sie müssen Ihre Methoden im Person-Prototyp definieren, nicht in einer Instanz von Person. Auf diese Weise werden sie kopiert werden, wenn Sie tun 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

Ich sehe, was Sie hier geändert haben, und ich danke Ihnen für Ihre Hilfe. Ich verstehe immer noch nicht, wie das Definieren dieser Funktionen im Prototypen der Person anders ist als das, was ich getan habe. Was ist der Zweck des Prototyps? –

+0

Wenn Sie ein Array von 100000 Personen erstellen, werden mit dem Prototyp die Funktionen nur einmal erstellt. Wenn Sie sie aus dem Konstruktor hinzufügen, sind dies nur Funktionen, die Sie in Ihrem Objekt erstellen, das eine Person ist. Sie werden also 100000 Mal erstellt. Hier ist eine bessere Erklärung: http://stackoverflow.com/questions/9772307/declaring-javascript-object-method-in-constructor-function-vs-in-prototype/9772864#9772864. Auf diese Weise sind sie nur lokale Funktionen für Ihre bestimmte Instanz des Objekts, so dass sie nicht vererbt werden – juvian

+0

@NickP hier ist ein anderer Weg mit Ihrer Methode: https://jsfiddle.net/o41ng2rn/ – juvian