调用Javascript工厂方法

时间:2012-01-03 03:21:09

标签: javascript

我正在学习面向对象的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脚本处理的实际区别是什么?

4 个答案:

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

ReturnsFunctionReturnsObject构造函数都会显示false结果,这意味着与instanceof运算符一起使用时,它们不会返回new个结果

instanceof运算符一起使用时,所有其他构造函数执行会自行返回new

this除外,如上所述