2017-05-07 190 views
2

我有一个关于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> 

所以这个代码应该使用对象的功能,并打印出它的名字...... 但是......我得到的只是一个空白网页! 请帮忙!! 谢谢!

回答

1

你得到了一些残酷的答案,而是一个有词法闭包似乎缺少。所以你在这里:

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对象。

+0

非常感谢你的电话功能!我想要做这样的事情,但我不知道电话()谢谢! :D – Joza100

+0

@ Joza100 ehm,欢迎您,请记住,广泛使用'''call'''被认为是可怕的风格。虽然你可能会发现其中一些细节很有用,但这个问题的经典解决方案实际上是'''this.name = name; this.printName = function(){...};'''或者带有prototype像'''this.name = name;'''在构造函数中和'''person.prototype.printName = function(){...};'''分开) – tevemadar

+0

OK!谢谢!!如果只有我知道关于原型的东西...我必须学习它们 – Joza100

0

检查本次修订:

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; 
    } 

} 
+0

嗯..我只是在这个编程语言是初学者所以这段代码是有点难以理解,我...我发现了一个更好的答案!感谢您试图帮助! :D – Joza100

0

只是一个小变化(你试图调用person对象的printName方法)。

function person(name){ 
    this.name = name; 
    this.printName = function() { 
    return this.name; 
    } 
} 

var joza = new person("Josip"); 

document.write(joza.printName()); 
+0

哦,刚才注意到,你在我之前写了和我一样的东西。我会删除我的答案。 –

+0

谢谢@OlivierKrull –

+0

非常感谢。我遵循TheNewBoston的教程,他用第一个函数编写函数,我只是跟着他。但是,现在我知道我想要什么。谢谢 – Joza100

0

(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或多或少是你的“构造函数”的函数人。然后,将你的函数放入原型中并调用它们。

+0

嗯..我只是这种编程语言的初学者,所以这段代码对我来说有点难以理解......我找到了更好的答案!感谢您试图帮助! :D – Joza100

+0

试图解释它好一点,希望它有帮助! – Gacci

1

忽略现在这里的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" 
+0

感谢您的回答,但已有相同的答案!谢谢你的解释,因为解释 – Joza100

0

下面是在JavaScript中添加对象,如Java

function person(name){ 
      this.name = name; 
     } 

添加这样的方法方式。所有Person对象将能以 '新'

var joza = new person("Josip"); 

调用方法这样

joza.printName(); 
0
<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对象内部