2017-04-13 6 views
1

Ich muss eine String-Writer-Funktion, die eine Überschrift und Körper enthält erweitern. Der Körper kann mehrere angehängte Linien haben, bevor die gesamte "Zeichenkette" gerendert wird. Dann wird auf ein neues Objekt verwiesen. Mein Problem hier ist, dass, wenn ich die Unterfunktion des Prototyps anrufe, der Körper für die übergreifende Funktion nicht zugänglich ist. Ich muss etwas Einfaches vermissen .... Gedanken? DankJavascript Sub-Funktion in einer Prototyp-Funktion

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

Kontext Problem. 'this' in' add' verweist auf den neuen Kontext des 'Item' Konstruktors. Um add mit 'Primary'-Kontext aufzurufen, müssen Sie' call' oder 'bind' oder' apply' verwenden, um den Kontext extern festzulegen. zB: 'privalue.add.call (Primary, 'bob', 'smith');' –

Antwort

0

nicht sicher, was der Zweck der .Item Funktion ist? Würden vorschlagen, Namen in Kleinbuchstaben zu ändern, wenn die Eigenschaft keine Funktion ist, geben Sie this von Item zurück. Alternativ einfach Primary.add() nennen und lassen .Item Funktion

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

Also, das schafft nicht das, wonach ich suche. Hier sollte das Ergebnis My Heading sein, dann Bob: Smith Sally: Smith darunter. Dies zeigt nur ein einzelnes Element im Körper, das letzte. –

+0

@JimGirard Verwenden Sie '+ =' -Operator in der '.add' -Funktion, wenn Sie' this.body' so einstellen, dass Aufrufe von '.add' mit bestehenden String-Werten verknüpft werden, siehe aktualisierten Beitrag. – guest271314

1

Die Verwendung von new Primary.Item() ist nicht ganz richtig, habe ich geändert diese konsequent ein wenig mehr zu arbeiten:

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()); 

Hier ist ein JsFiddle

Verwandte Themen