调用Javascript工厂方法
我正在学习面向对象的Java脚本。我有下面的工厂方法代码调用Javascript工厂方法,javascript,Javascript,我正在学习面向对象的Java脚本。我有下面的工厂方法代码 function Foo() { var value = 1; return { method: function() { return value; }, value:value } } Foo.prototype = { bar: function() {} }; new Foo(); Foo(); 方法Foo可以通过两种方式调
function Foo() {
var value = 1;
return {
method: function() {
return value;
},
value:value
}
}
Foo.prototype = {
bar: function() {}
};
new Foo();
Foo();
方法Foo可以通过两种方式调用<代码>新Foo()代码>或Foo()代码>两者做相同的事情,输出相同。java脚本处理的实际区别是什么?这里有一个很好的链接:
另见:
但这里是最好的链接(事实上,也是你问题的答案:
JavaScript是一种无类、面向对象的语言,因此
使用原型继承而不是经典继承。这可以
对于接受过传统面向对象培训的程序员来说,这是一个令人费解的问题
语言如C++和java…< /P>
在正常情况下,当从构造函数创建对象时应使用new
,而在执行任何其他函数调用时应避免使用。当对函数使用new
时,1)创建一个新对象;2) 使用绑定到新对象的this
值调用函数,3)函数返回的值(默认情况下)是在步骤1中创建的对象
然而,在您的例子中,您从“构造函数”返回了一个全新的对象(与上面1中的对象不同),这意味着没有实际的区别。this
的值在函数内部仍然不同,但这两个值都将返回false
:
new Foo() instanceof Foo;
Foo() instanceof Foo;
要说明这一差异,请将以下内容添加到Foo
:
alert(this instanceof Foo)
使用new
调用时,此警报true
;在没有它的情况下调用时,false
此外,将对象指定给Foo.prototype
没有意义,因为您永远不会创建任何使用它的Foo
实例(因为您返回的是与Foo
完全不同的内容)
如果要从Foo
返回自定义对象,则应选择不带new
的版本;如果要忽略它并返回完全不同的内容,那么创建Foo的新实例就没有意义了。函数中的javascript new关键字非常奇怪。我所能找到的对正在发生的事情的最好(唯一?)深入解释实际上来自丹尼尔·霍华德
对于任何试图学习Javavscript一些更高级概念的人来说,这应该是必读的
顺便说一句,在js中,你可以通过根本不使用新关键字来获得真正的。请注意,使用jquery的代码基本上都不依赖它。因为您是从Foo
返回对象,所以使用new
没有任何效果。Foo()
和newfoo()
的返回值将不是Foo
的实例;相反,它们将是您返回的任何值类型的实例
如果您从构造函数返回任何†对象或任何函数,则会看到相同的行为但是,如果Foo
返回:
- 一串
- 数
null
未定义
(与不返回任何内容相同)
- 或
此
…那么new Foo()
的返回值将是Foo
的一个实例
您可以在上测试以下代码:
ReturnsFunction
和ReturnsObject
构造函数都将显示false
结果,这意味着当与新的操作符一起使用时,它们不会返回自身的实例
当与new
操作符一起使用时,所有其他构造函数都会返回自己的实例
†除了我上面提到的这个
,是的。我测试了两个返回值为假。任何关于“此函数的值在函数内部会有所不同”的小例子?这是更好的解释。new创建Foo的实例,而没有new只保留一个静态对象,可以随时使用。正确吗?此外,设置Foo.prototype
变得毫无意义,因为您创建的对象不是Foo
@nnnnnn的实例-是的,我只是想做一个类似的注释。我想我会更新我的答案。谢谢。请注意,如果您打算从Foo()
函数返回您自己的对象,而不是使用JS为您创建的对象,那么设置Foo.prototype={something}
是毫无意义的。当您说new Foo()
@Bakudan时,JavaScript是面向对象的。@Bakudan,若你们有什么要说的(面向对象和基于对象),用新答案中的例子来证明。它将帮助新手:)@onemach,你可以在答案中做出贡献,而不是拼写错误:)可能不值得自己回答,但请注意,newfoo
将没有属性bar
。使用new
时,如果不返回对象,则返回Foo.prototype
。因为您在每次调用中都创建了一个对象文本,所以会返回它。您的意思是,函数和对象不会返回自身的实例。所以Foo()和new Foo()也没有。但是,如果他们归还其他东西。它们是自己实例的一部分@乌梅什,完全正确。我觉得这种行为很不直观!谢天谢地
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)
);