JavaScript对象的函数不返回
我有一个关于JavaScript的问题! 我一直在学习JavaScript几天,但它并不是那么难,因为我知道有很多来自Java的知识。到目前为止,我已经编程了很长时间。我与对象一起工作,我想为对象添加一个函数。但是,这funcion不能正常工作... 代码:JavaScript对象的函数不返回
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function person(name){
this.name = name;
}
function printName(){
return this.name;
}
var joza = new person("Josip");
</script>
</head>
<body>
<script type="text/javascript">
document.write(joza.printName());
</script>
</body>
</html>
所以这个代码应该使用对象的功能,并打印出它的名字...... 但是......我得到的只是一个空白网页! 请帮忙!! 谢谢!
你得到了一些残酷的答案,而是一个有词法闭包似乎缺少。所以你在这里:
function Person(name){
this.printName=function(){
console.log(name);
};
}
test=new Person("John");
test.printName();
问题是JavaScript函数保留了声明它们的环境。所以这里的内部函数可以访问外部函数的局部变量,即使外部函数没有运行了。其实它类似于访问Java中的匿名内部类final
局部变量,只是这些变量不必是最终的(所以这将是完全有可能提供的setName方法,它会改变的同名变量)。
这不是很重要/有趣的这一特定使用案例,但是这是一种常见的方式,你如何能得到的参数为例如回调方法。
而混淆的最佳部分:
您的原始代码也可以使用。 JavaScript是不是“本”很挑剔,你可以在任何对象上调用任何方法:
function Person(name){
this.name=name;
}
function printName(){
console.log(this.name);
}
test=new Person("Jane");
printName.call(test);
函数是对象,他们有一个call
方法。第一个参数设置为this
,其余的只是作为参数传递给方法本身。为了完整性,还有一个apply
方法,其中函数的参数作为数组传递。
这不是在这里非常重要要么,但是你应该记住的事情是,this
不一定是你所期望的对象。再次回调方法:如果使用对象方法作为回调,当浏览器调用它时,this
通常是window
对象。
检查本次修订:
var person = function(name){
var tmp = {};
tmp.name = name;
tmp.printName = function(){
return tmp.name;
}
return tmp;
}
var joza = new person("Josip");
小提琴:https://jsfiddle.net/jwvvkgaf/
这是一个工厂模式,来完成你想要的方式之一。
如果你想简单的构造模式:
var person = function(name){
this.name = name;
this.printName = function() {
return this.name;
}
}
嗯..我只是在这个编程语言是初学者所以这段代码是有点难以理解,我...我发现了一个更好的答案!感谢您试图帮助! :D – Joza100
只是一个小变化(你试图调用person
对象的printName
方法)。
function person(name){
this.name = name;
this.printName = function() {
return this.name;
}
}
var joza = new person("Josip");
document.write(joza.printName());
哦,刚才注意到,你在我之前写了和我一样的东西。我会删除我的答案。 –
谢谢@OlivierKrull –
非常感谢。我遵循TheNewBoston的教程,他用第一个函数编写函数,我只是跟着他。但是,现在我知道我想要什么。谢谢 – Joza100
(function(global){
function person(name){
this.name = name;
}
person.prototype ={
printName: function(){
return this.name;
},
};
window.person = person;
}(window));
var joza = new person("Josip");
document.write(joza.printName());
让我打破它给你的。 (function(){ /* code in here */ }())
这是一个范围。基本上就像一个命名空间,所以你不会污染window
全局变量。然后你声明构造函数初始化属性name
或多或少是你的“构造函数”的函数人。然后,将你的函数放入原型中并调用它们。
忽略现在这里的HTML是你的代码:
function person(name){
this.name = name;
}
function printName(){
return this.name;
}
var joza = new person("Josip");
joza.printName() // Error
那么是什么上面的事情是,你正在创建的是外面这个人的构造函数,然后另一个功能。你的joza对象没有printName函数。
printName函数只是一个常规函数,它有自己的上下文,在这种情况下,它只是窗口。
当您调用joza.printName时,您会发现printName在您刚刚创建的joza对象上不存在。
尝试此通过,而不是添加您的printName方法实际返回的Person对象:
function person(name){
this.name = name;
this.printName = function() {
return this.name
}
}
var joza = new person("Josip");
joza.printName() // "Josip"
感谢您的回答,但已有相同的答案!谢谢你的解释,因为解释 – Joza100
下面是在JavaScript中添加对象,如Java
function person(name){
this.name = name;
}
添加这样的方法方式。所有Person对象将能以 '新'
var joza = new person("Josip");
调用方法这样
joza.printName();
<html>
<head>
<script type="text/javascript">
function person(name) {
this.name = name;
this.printName = function() {
return this.name;
}
}
var joza = new person("Josip");
</script>
</head>
<body>
<script type="text/javascript">
document.write(joza.printName());
</script>
</body>
</html>
的
function printName(){
return this.name;
}
调用此
person.prototype.printName = function(){
return this.name;
}
实例化新对象
不是Person
成员,所以你可以从它的名字属性,你应该把方法pesron对象内部
非常感谢你的电话功能!我想要做这样的事情,但我不知道电话()谢谢! :D – Joza100
@ Joza100 ehm,欢迎您,请记住,广泛使用'''call'''被认为是可怕的风格。虽然你可能会发现其中一些细节很有用,但这个问题的经典解决方案实际上是'''this.name = name; this.printName = function(){...};'''或者带有prototype像'''this.name = name;'''在构造函数中和'''person.prototype.printName = function(){...};'''分开) – tevemadar
OK!谢谢!!如果只有我知道关于原型的东西...我必须学习它们 – Joza100