我正在学习面向对象的Java脚本。我有以下工厂方法代码。
function Foo() {
var value = 1;
return {
method: function() {
return value;
},
value:value
}
}
Foo.prototype = {
bar: function() {}
};
new Foo();
Foo();
方法Foo可以通过两种方式调用。 new Foo();
或Foo();
两者都做同样的事情,输出也一样。 java脚本处理的实际区别是什么?
答案 0 :(得分:3)
在正常情况下,从构造函数创建对象时应使用new
,并在执行任何其他函数调用时避免使用new
。在函数1上使用this
时,会创建一个新对象; 2)使用绑定到该新对象的值this
调用该函数,以及3)从该函数返回的值(默认情况下)是在步骤1中创建的对象。
但是,在你的情况下,你从“构造函数”(不同于上面的1中的对象)返回一个全新的对象,这意味着没有实际的区别。 false
的值在函数内部仍然不同,但这两个值都将返回new Foo() instanceof Foo;
Foo() instanceof Foo;
:
this
为说明Foo
差异,请将以下内容添加到alert(this instanceof Foo)
:
new
使用true
进行通知时,此警报false
;在没有它的情况下调用Foo.prototype
。
此外,将对象分配给Foo
是没有意义的,因为你永远不会创建任何可以使用它的Foo
实例(因为,再次,你将返回一些完全不同的东西)来自Foo
)。
如果您要从new
返回自定义对象,那么您应该更喜欢没有Foo
的版本;如果您要忽略它并返回完全不同的东西,那么创建{{1}}的新实例毫无意义。
答案 1 :(得分:2)
这是一个很棒的链接:
Is Javascript "new" considered harmful?
另见:
http://phabricator.com/docs/phabricator/article/Javascript_Pitfalls.html
但这是最好的链接(实际上,问题的答案是:
http://www.crockford.com/javascript/inheritance.html
JavaScript是一种免费的,面向对象的语言,因此,它就是这样 使用原型继承而不是经典继承。这个可以 对传统的面向对象培训的程序员感到困惑 像C ++和Java这样的语言......
答案 2 :(得分:1)
函数中的javascript new关键字非常奇怪。我能够找到的最好(唯一?)深入解释发生的事情实际上是来自Daniel Howard的this SO answer。
任何想要学习Javavscript的一些更高级概念的人都应该阅读。
顺便说一句,你可以通过永远不使用new关键字在js中获得真正远。注意基本上没有一个使用jquery的代码依赖它。
答案 3 :(得分:0)
因为您要从Foo
返回对象,所以使用new
无效。 Foo()
和new Foo()
的返回值不是Foo
的实例;相反,它们将是您返回的任何值的类型的实例。
如果从构造函数返回任何†对象或任何函数,则会出现相同的行为。 但,如果要返回Foo
:
null
undefined
(与完全没有任何内容相同)this
...然后new Foo()
的返回值将成为Foo
的实例。
您可以在JSFiddle上测试以下代码:
function ReturnsString() { return "string"; }
function ReturnsNumber() { return 1; }
function ReturnsNull() { return null; }
function ReturnsUndefined() { return void 0; }
function ReturnsThis() { return this; }
function ReturnsFunction() { return function() {}; }
function ReturnsObject() { return {}; }
alert("Results:"
+ "\nReturnsString: " + (new ReturnsString() instanceof ReturnsString)
+ "\nReturnsNumber: " + (new ReturnsNumber() instanceof ReturnsNumber)
+ "\nReturnsNull: " + (new ReturnsNull() instanceof ReturnsNull)
+ "\nReturnsUndefined: " + (new ReturnsUndefined() instanceof ReturnsUndefined)
+ "\nReturnsThis: " + (new ReturnsThis() instanceof ReturnsThis)
+ "\nReturnsFunction: " + (new ReturnsFunction() instanceof ReturnsFunction)
+ "\nReturnsObject: " + (new ReturnsObject() instanceof ReturnsObject)
);
ReturnsFunction
和ReturnsObject
构造函数都会显示false
结果,这意味着与instanceof
运算符一起使用时,它们不会返回new
个结果
与instanceof
运算符一起使用时,所有其他构造函数执行会自行返回new
。
†this
除外,如上所述