2015-05-06 47 views
0

有人可以確認如果下面的腳本確實是JavaScript內類繼承的正確方法嗎?這是Javascript中類繼承的正確方法嗎?

錯誤的方式

var Person = function() { 
    this.className = this.constructor.toString().match(/^function ([a-z_0-9]+)\(/i)[1]; 
    console.log(this.className); //ERROR 
} 

var Mark = function() { 
    Person.call(this); 
} 

Mark.prototype    = Object.create(Person.prototype); 
Mark.prototype.constructor = Mark; 

new Person; // I LIKE TO DISPLAY 'Person' 
new Mark; // I LIKE DISPLAY 'Mark' 

正確的方式

function Person() { 
    this.className = this.constructor.toString().match(/^function ([a-z_0-9]+)\(/i)[1]; 
    console.log(this.className); 
} 

function Mark() { 
    Person.call(this); // Class Mark extend Person 
} 

Mark.prototype    = Object.create(Person.prototype); 
Mark.prototype.constructor = Mark; 

function Matteo() { 
    Mark.call(this); // Class Matteo extend Mark 
} 

Matteo.prototype    = Object.create(Mark.prototype); 
Matteo.prototype.constructor = Matteo; 

new Person; // Displays: 'Person' 
new Mark; // Displays: 'Mark' 
new Matteo; // Display: 'Matteo' 
+1

[Javascript get Function Name?]可能重複(http://stackoverflow.com/questions/2648293/javascript-get-function-name) – Hexaholic

+0

您的代碼打印'undefined' – shyam

+1

您打算打印哪個變量名稱?函數本身的名字? –

回答

3

這個工作對我來說:

function Person() { 
 
    console.log(this.constructor.toString().match(/^function ([a-z_0-9]+)\(/i)[1]); 
 
} 
 

 
function Mark() { 
 
    Person.call(this); 
 
} 
 

 
function Matteo() { 
 
    Mark.call(this); 
 
} 
 

 
new Person(); // "Person" 
 
new Mark(); // "Mark" 
 
new Matteo(); // "Matteo"

+0

感謝您的貢獻,您能回答這個新問題嗎? – Mark

+0

請參閱我的編輯,它仍然有效 –