Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用Javascript工厂方法_Javascript - Fatal编程技术网

调用Javascript工厂方法

调用Javascript工厂方法,javascript,Javascript,我正在学习面向对象的Java脚本。我有下面的工厂方法代码 function Foo() { var value = 1; return { method: function() { return value; }, value:value } } Foo.prototype = { bar: function() {} }; new Foo(); Foo(); 方法Foo可以通过两种方式调

我正在学习面向对象的Java脚本。我有下面的工厂方法代码

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