2011-01-22 70 views
2

我对作为类的函数中的return语句感到困惑。请参阅下面的示例代码:函数返回语句作为类

<html> 
<body> 

<script type="text/javascript"> 
function test() { 
    this.abc = 'def'; 
    return 3; 
} 

var mytest = new test(); 

document.write(mytest + ', ' + (typeof mytest) + ', ' + mytest.abc); 

</script> 

</body> 
</html> 

代码输出:[object object],object,def。

这是我的问题。我在test()函数中写了'return 3'。当'new test()'被调用时,这个语句是否被忽略?

感谢。

+0

JavaScript没有类。 js中的对象基于原型... – Ivan 2011-01-22 19:34:47

回答

3

当你用new调用一个函数时,你会调用它作为一个构造函数,它会自动返回它构造的新对象。

您的return 3;语句被忽略。什么是有效的返回是:

{ abc:'def' } 

...有一个隐含的参照prototype对象,这在你的例子不具有任何枚举的属性,因为你没有给它任何。

如果你做的事:

mytest instanceof test; 

...这将评估为true

如果你做的事:

function test() { 
    this.abc = 'def'; 
} 
test.prototype.ghi = 'jkl'; 

var mytest = new test(); 

...你可以再做:

mytest.ghi; 

...这将使你的价值'jkl'

3

您可以结帐following article

+0

感谢Darin,我正在寻找! – Shanimal 2014-03-25 15:40:07

+0

万一文章接着陈旧,我写了[答案](http://stackoverflow.com/questions/4770070/return-statement-in-a-function-as-class#42603663)与快速摘要 – aljgom 2017-03-05 02:48:10

0

new运算符实例化并返回对象。下面是一些例子,其输出:

(...) 
var mytest = test(); 
document.write(mytest + ', ' + (typeof mytest) + ', ' + mytest.abc); 
// 3, number, undefined 

或者:

function test() { 
    this.abc = 'def'; 
    this.getvalue = function(){ 
     return 3; 
    } 
} 
var mytest = new test(); 
document.write(mytest.getvalue() + ', ' + (typeof mytest) + ', ' + mytest.abc); 
// 3, object, def 
0

当您使用new运营商,您使用的功能构造,在这种情况下返回值:

  • 如果它不是对象,它(在你的例子一样)忽略
  • 如果是一个对象,返回的对象成为整个new表达

的结果,所以,如果你写

Test = function(arg) { 
    this.a = 1; 
    return arg; 
} 

var t1 = new Test(10); 
var t2 = new Test({b: 2}); 
console.log(t1, t2) 
// output: 
// Test {a:1} Object {b: 2}