2017-04-13 165 views
1

我需要擴展一個字符串編寫器函數,它包含標題和正文。在整個「字符串」被渲染之前,主體可以有多個附加行。然後引用一個新對象。我的問題在於,當我調用原型的子函數時,主體無法訪問整體功能。我必須錯過一些簡單的想法。由於原型函數中的Javascript子函數

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功能的目的是什麼?建議將名稱調小寫屬性不是函數,從Item調用返回this。另外,只需撥打Primary.add()並省略.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

所以,這並沒有達到我要找的。這裏的結果應該是我的標題,然後是鮑勃:史密斯莎莉:史密斯。這隻顯示了最後一個在身體中的單個項目。 –

+0

@JimGirard設置'this.body'將'.add'中的調用連接到現有的字符串值時,可以在'.add'函數中使用'+ ='運算符。 – guest271314

1

使用的new Primary.Item()是不完全正確的,我已經修改了這多一點的工作始終:

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