2017-04-13 1 views
1

見出しと本文を格納する文字列ライター関数を拡張する必要があります。本文には、文字列全体がレンダリングされる前に複数の行が追加されている場合があります。次に、新しいオブジェクトが参照されます。ここでの問題は、プロトタイプのサブ関数を呼び出すと、ボディが関数全体にアクセスできないということです。私は単純な何かを見逃している必要があります....考え?おかげPrototype関数のJavascript Sub関数

https://jsfiddle.net/hitman1733/n2od4s6s/

var StringBuilder = function() { 
    this.Heading; 
    this.Body; 
} 

StringBuilder.prototype.Heading = function(text){ 
    this.Heading = text + '\n'; 
} 

StringBuilder.prototype.Item = function() 
{ 
    this.add = function(field, text) { 
      this.Body = '  ' + field +': ' + text + '\n'; 
    } 
} 

StringBuilder.prototype.Append = function() { 
    return this.Heading + '\n' + this.Body; 
} 

var Primary = new StringBuilder(); 
Primary.Heading = 'My Heading'; 

var privalue = new Primary.Item(); 
privalue.add('bob', 'smith'); 
privalue.add('sally', 'smith'); 

console.log(Primary.Append()); 
+0

文脈の問題があります。 'add'の' this'は 'Item'コンストラクタの新しいコンテキストを参照しています。 'Primary'コンテキストでaddを呼び出すには、コンテキストを外部に設定するために' call'か 'bind'か' apply'を使う必要があります。 'privalue.add.call(Primary、 'bob'、 'smith');' –

答えて

0

.Item関数の目的が何であるかを特定しませんか?プロパティが関数ではない場合、名前を小文字に調整することを提案しますが、thisItemから呼び出して返します。また、単にnew Primary.Item()の使用は非常に適切ではありません

var StringBuilder = function() { 
 
    this.heading = ""; 
 
    this.body = ""; 
 
} 
 

 
StringBuilder.prototype.Heading = function(text) { 
 
    this.heading = text + '\n'; 
 
} 
 

 
StringBuilder.prototype.Item = function() { 
 
    return this 
 
} 
 

 
StringBuilder.prototype.add = function(field, text) { 
 
    this.body += '  ' + field + ': ' + text + '\n'; 
 
    } 
 

 
StringBuilder.prototype.Append = function() { 
 
    return this.heading + '\n' + this.body; 
 
} 
 

 
var Primary = new StringBuilder(); 
 
Primary.heading = 'My Heading'; 
 

 
// var privalue = Primary.Item(); // necessary? 
 
// Primary.add('bob', 'smith'); 
 
// Primary.add('sally', 'smith'); 
 

 
var privalue = Primary.Item(); 
 
privalue.add('bob', 'smith'); 
 
privalue.add('sally', 'smith'); 
 

 
console.log(Primary.Append());

+0

これは私が探しているものを達成しません。ここで結果はMy Heading、次にBob:Smith Sally:Smithの順になります。これは、ボディの1つのアイテム、最後のアイテムのみを表示します。 –

+0

@JimGirard '.add'内の' + = '演算子は、' this.body'を呼び出して '.add'への呼び出しを既存の文字列値に連結するときに使用します。最新の記事を参照してください。 – guest271314

1

.Item機能Primary.add()を呼び出し、省略、私は、これはもう少し一貫して動作するように修正している:

const StringBuilder = function() { 
    this.items = []; 
    this.heading = ""; 
    this.body = ""; 
} 

StringBuilder.prototype.heading = function(text) { 
    this.heading = text; 
} 

StringBuilder.prototype.body = function(text) { 
    this.body = text; 
} 

StringBuilder.prototype.addItem = function(field, text) { 
    this.items.push(`${field} : ${text}`); 
} 

StringBuilder.prototype.append = function() { 
    // note: using breaks only in the append method. 

    this.body += `\n${this.items.join('\n')}`; // join items to existing body. 

    return `${this.heading}\n${this.body}`; 
} 

const primary = new StringBuilder(); 

primary.heading = "My Heading"; 
primary.body = "My Body"; 
primary.addItem('bob', 'smith'); 
primary.addItem('sally', 'smith'); 

console.log(primary.append()); 

ここには、JsFiddle