2016-04-21 5 views
0

私は、コンストラクタ内のプロパティの1つとしてメソッドを使用する必要がある関数コンストラクタを持っています。私はいつもこれが機能してこれを行う方法であるだろうと教えられてきたコンストラクタの外側でプロトタイプを作成したときに関数が正しく返されますが、コンストラクタ内でメソッドとして使用されていないときは、関数が返されるのはなぜですか?

var currentDate = new formatDate(new Date()); 
console.log(currentDate.year, currentDate.month, currentDate.dayOfMonth, currentDate.dayOfWeek, currentDate.second); 


function formatDate(dateHolder){ 
    this.monthsArray = ["Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]; 
    this.daysOfWeekArray = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 
    this.date = new Date(dateHolder); 
    this.year = this.date.getFullYear(); 
    this.month = this.monthsArray[this.date.getMonth()]; 
    this.dayOfMonth = this.addZero(this.date.getDate()); 
    this.dayOfWeek = this.daysOfWeekArray[this.date.getDay()]; 
    this.minute = this.addZero(this.date.getMinutes()); 
    this.second = this.addZero(this.date.getSeconds()); 
    this.addZero = function(i){ 
     if(i < 10){ 
      i = "0" +i; 
     } 
     return i; 
    } 
} 

:通常、私は単純にそうようなプロパティとして関数を作成したいです。しかし、アプリケーションを実行するたびに、this.addZeroが関数ではないというエラーが表示されます。私は同じことを行うが、それはそれはになっていますように動作しますので、

formatDate.prototype.addZero = function(i){ 
    if(i < 10){ 
     i = "0" +i; 
    } 
    return i; 
} 

function formatDate(dateHolder){ 
    this.monthsArray = ["Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]; 
    this.daysOfWeekArray = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; 
    this.date = new Date(dateHolder); 
    this.year = this.date.getFullYear(); 
    this.month = this.monthsArray[this.date.getMonth()]; 
    this.dayOfMonth = this.addZero(this.date.getDate()); 
    this.dayOfWeek = this.daysOfWeekArray[this.date.getDay()]; 
    this.minute = this.addZero(this.date.getMinutes()); 
    this.second = this.addZero(this.date.getSeconds()); 
} 

ようaddZeroメソッドのプロトタイプを作成する場合。

誰かが私が何か間違ったこと(そしてそれを修正する方法)を行っていて、それが正しい方法であるとしたら、それは片方向ではなく他者ではない理由を説明できますか?

答えて

1

定義する前にaddZeroに電話しています。あなたが最初にそれを定義し、それが動作するようにそれを周りに切り替えます

this.addZero = function(i){ 
    if(i < 10){ 
     i = "0" +i; 
    } 
    return i; 
}; 
this.dayOfMonth = this.addZero(this.date.getDate()); 
this.dayOfWeek = this.daysOfWeekArray[this.date.getDay()]; 
this.minute = this.addZero(this.date.getMinutes()); 
this.second = this.addZero(this.date.getSeconds()); 

や、機能があなただけの関数の宣言を使用して、巻上げに頼ることができthis使用していないので:

this.dayOfMonth = addZero(this.date.getDate()); 
this.dayOfWeek = this.daysOfWeekArray[this.date.getDay()]; 
this.minute = addZero(this.date.getMinutes()); 
this.second = addZero(this.date.getSeconds()); 

function addZero(i){ 
    if(i < 10){ 
     i = "0" +i; 
    } 
    return i; 
}; 

おそらく、いつでも(関数の本体がコンストラクターで宣言された変数にアクセスする必要がないときはいつでも)いつでもプロトタイプを使うべきです。プロトタイプに追加された関数はすべてのオブジェクトで再利用されますが、コンストラクターで作成された関数は複製されます(オブジェクトごとに新しい関数が作成されます。

+0

プロトタイプのバージョンを使用する方が良い方法ですか? –

+2

@Robertはい、その機能のためです。 – Paulpro

+0

持ち上げに何か利点や不利な点がありますか? –

関連する問題