2017-06-05 272 views
1

为什么我在使用document.write()时在浏览器中未定义?为什么我在使用document.write()时未定义?

<script type="text/javascript"> 
    function Person (name) { 
     this.name = name; 
     this.greeting = function() { 
      document.write("Hello " + name + " Go rock the industry!!"); 
     }; 
    } 

    var person1 = new Person("Sara"); 
    var person2 = new Person("Bob"); 

    document.write(person1.name + "<br>"); 
    document.write(person1.greeting() + "<br>"); 
    document.write(person2.name + "<br>"); 
    document.write(person2.greeting() + "<br>"); 

</script> 

在浏览器中我得到这个输出:

Sara 
Hello Sara Go rock the industry!!undefined 
Bob 
Hello Bob Go rock the industry!!undefined 
+4

'document.write'返回'undefined'达到同样的效果。你在'document.write'里面使用'document.write'。相反,只需从函数'return'Hello'+ name ...'返回字符串即可。 – Tushar

+0

如果你在'Person'原型上定义了'greetings'方法,并且将name命名为'this.name',而不是使用'document.write'在body上添加内容,那会更好。 – Tushar

+0

@Tushar你的意思是这个'function Person(name){ \t \t this.name = name; \t \t this.greeting = function(){ \t \t \t document.write(“Hello”+ this.name +“Go the industry the industry !!”“); \t \t}; \t} \t变种PERSON1 =新的Person(” 萨拉 “); \t文件撰写(person1.name +”
“); \t person1.greeting();' –

回答

1

您正在尝试在不返回值的函数使用document.write,而执行document.write本身。 Person.greeting()应返回一个值,以便在致电document.write(person2.greeting())时使用它。

应该是这样的:

function Person (name) { 
    this.name = name; 
    this.greeting = function() { 
     return ("Hello " + name + " Go rock the industry!!"); 
      ▲ 
    }; 
} 
+0

对不起,但过了15+后名誉较少我肯定会这样做 –

1

您需要更新greeting函数返回,而不是调用document.write()本身的字符串。

目前,greeting功能调用document.write()然后隐含返回值undefined

当你计算表达式

personX.greeting() + "<br/>"

评估为

undefined + "<br/>"

,并根据JavaScript字符串拼接的规则,undefined首先被浇铸到字符串"undefined"和然后与下一个值连接。


编辑:

如果你有兴趣探索property getter functions,你也可以重构为

function Person (name) { 
    this.name = name; 
    Object.defineProperty(this, 'greeting', { 
     get: function() { 
      return "Hello " + this.name + " Go rock the industry!!"; 
     } 
    }); 
} 

var person1 = new Person("Sara"); 
var person2 = new Person("Bob"); 

document.write(person1.name + "<br>"); 
document.write(person1.greeting + "<br>"); 
document.write(person2.name + "<br>"); 
document.write(person2.greeting + "<br>"); 

通知我们如何能够再访问计算值personX.greeting,如果它只是一个字符串属性。

根据您的环境,等等,如果你可以使用ES2015 +语法,你可以用

class Person { 

    constructor(name) { 
    this.name = name; 
    } 

    get greeting() { 
    return `Hello ${this.name} Go rock the industry!!` 
    } 
} 

let person1 = new Person('Sara'); 
let person2 = new Person('Bob'); 

document.write(person1.name + "<br>"); 
document.write(person1.greeting + "<br>"); 
document.write(person2.name + "<br>"); 
document.write(person2.greeting + "<br>"); 
+0

我可以这样做:'功能Person(name ){' \t \t'this.name =名称;' \t \t'this.greeting =函数(){' \t \t \t'文件撰写( “你好” + this.name +“走摇滚的行业! ! “);' \t \t'};' \t'}' \t'VAR PERSON1 =新的Person(” 萨拉 “);' \t'文件撰写(person1.name +”
“);' \t'person1.greeting();' –

+0

那也行,是的。但是,它会在你的对象的工作方式上造成奇怪的不一致;如果你这样做,可能会将'greeting'方法重命名为'writeGreeting'或其他东西,这样你(和任何其他开发人员)就知道它正在写入文档而不是返回字符串。 – nikulis