2016-07-01 11 views
0
<script> 
    var Employee = new function(name) 
    { 
    this.name=name; 
    } 
    Employee.prototype.getName = function() 
    { 
     return this.name; 
    } 

    var PermanenetEmployee = new function(annualsalary) 
    { 
    this.annualsalary=annualsalary; 
    } 
    var employee = new Employee("rahul"); 
    PermanenetEmployee.prototype = employee; 
    var pe = new PermanenetEmployee(5001); 
    document.write(pe.getName()); 



    </script> 

Ich implementiere Vererbung in Java-Skript. Von diesem Code möchte ich Mitarbeiter Name wie "Rahul" drucken. Aber ich bekomme Fehler in diesem wie Uncaught TypeError: Kann Eigenschaft 'getName' von nicht definiert (anonyme Funktion) .Wie kann ich diesen Fehler beheben?Uncaught TypeError: Kann die Eigenschaft 'getName' von undefined (anonyme Funktion) nicht setzen

Employee.prototype.getName = function() 
     { 
      return this.name; 
     } 

Antwort

2

Das ist das Problem:

var Employee = new function(name) 
// ------------^^^ 
{ 
this.name=name; 
} 

(Und das gleiche für PermanenetEmployee.)

Sie nicht new es wollen. newruft die Funktion auf. Das wollen Sie später machen, wie Sie es bei der Zuweisung an employee haben.


Beachten Sie, dass die Art, wie Sie die Vererbung zwischen ihnen einrichten, ein Anti-Pattern ist. Um PermanenetEmployee richtig "Unterklasse" Employee, dies tun:

PermanenetEmployee.prototype = Object.create(Employee.prototype); 
PermanenetEmployee.prototype.constructor = PermanenetEmployee; 

nicht

var employee = new Employee("rahul"); 
PermanenetEmployee.prototype = employee; 

... und dann PermanenetEmployeename akzeptieren und übergibt es an Employee:

var PermanenetEmployee = function(name, annualsalary) { 
    Employee.all(this, name); // <==== 
    // ... 
}; 

. ..oder besser verwenden, verwenden Sie ES2015 ("ES6") class (transpilieren, wenn Sie benötigen, zum Beispiel mit Babel).

Hier ist eine korrekte Einrichtung. Ich habe fixiert auch die Tippfehler in PermanenetEmployee:

var Employee = function(name) { 
 
    this.name = name; 
 
}; 
 
Employee.prototype.getName = function() { 
 
    return this.name; 
 
}; 
 

 
var PermanentEmployee = function(name, annualSalary) { 
 
    Employee.call(this, name); 
 
    this.annualSalary = annualSalary; 
 
}; 
 

 
// Set up subclass 
 
PermanentEmployee.prototype = Object.create(Employee.prototype); 
 
PermanentEmployee.prototype.constructor = PermanentEmployee.prototype; 
 

 
PermanentEmployee.prototype.getAnnualSalary = function() { 
 
    return this.annualSalary; 
 
}; 
 

 
// Using 
 
var pe = new PermanentEmployee("Rahul", 5001); 
 
console.log(pe.getName()); 
 
console.log(pe.getAnnualSalary());

Und mit ES2015:

class Employee { 
 
    constructor(name) { 
 
     this.name = name; 
 
    } 
 
    getName() { 
 
     return this.name; 
 
    } 
 
} 
 

 
class PermanentEmployee extends Employee { 
 
    constructor(name, annualSalary) { 
 
     super(name); 
 
     this.annualSalary = annualSalary; 
 
    } 
 

 
    getAnnualSalary() { 
 
     return this.annualSalary; 
 
    } 
 
} 
 

 
// Using 
 
var pe = new PermanentEmployee("Rahul", 5001); 
 
console.log(pe.getName()); 
 
console.log(pe.getAnnualSalary());

Auch hier beachten Sie, dass Sie, wenn Sie auf transpile brauchen möchte diese Syntax in der Wildnis verwenden (für jetzt).

0

Es gibt ein paar Möglichkeiten, wie Sie die Vererbung in JS arbeiten können, ich verwende dieses Muster.

Zuerst erklären die Basis Prototyp:

Employee = function() { 
}; 
Employee.prototype = { 
    getName: function() {} 
}; 

Und dann den Prototyp, der die Basis erbt:

PermanentEmployee = function() { 
    Employee.call(this); 
}; 

PermanentEmployee.prototype = Object.create(Employee.prototype); 
PermanentEmployee.constructor = PermanentEmployee; 

PermanentEmployee.prototype.foo = function() {}