如何区分工厂对象和功能?

时间:2013-02-17 16:00:03

标签: javascript

我了解到可以在JavaScript(工厂函数)中创建单向对象如下:

var newPerson=function(name){  
    var result = new Object();  
    result.name = name;  
    result.getName = function(){  
        return this.name;  
    };  
    return result;  
}; 


var personOne = newPerson("Diego");  
var personTwo = newPerson("Gangelo");  

console.log(personOne.getName()); // prints Diego  
console.log(personTwo.getName()); // prints Gangelo

好吧,我找到了一个可以创建函数的地方:

var hello = new Function('alert("Hello, World!");');

那么如果它们以相同的方式声明,我怎么能知道函数中的对象呢?

2 个答案:

答案 0 :(得分:2)

  

“如果以相同的方式声明对象,我怎么能知道它的对象?”

嗯...由于Function构造函数返回function个对象,您只需使用typeof进行测试即可。

typeof hello === "function"; // true

typeof personOne === "function"; // false

“工厂函数”只是您编写的返回新对象的函数的一个奇特术语。这是使用对象构造函数创建对象的另一种方法。

因此,如果我想要一个创建新对象的函数,我可以使用一个函数作为构造函数,这需要我用new调用它:

function MyObj() {
    this.foo = "bar"
}

var o = new MyObj();

或者我可以使用这种“工厂”模式:

function MyObj() {
    return {
        foo: "bar"
    }
}

var o2 = MyObj();

它们都创建了一个新对象,但第一种方法为您提供了一个额外的原型对象,您可以在不影响其他对象的情况下进行扩展。

这些方法都不是一个功能对象。


JavaScript内置了用于创建本机对象和基元的构造函数。构造函数如:

  • Function
  • Array
  • Object
  • RegExp

......等等。

这些内置于环境中,可用于创建新的本机数据。但是JS也让你能够构建自己的构造函数。这就是我在上面的例子中所做的。

您自己的构造函数返回一个Object,但它又链接到一个干净的prototype对象,该对象可以扩展为从该构造函数创建的所有对象。

答案 1 :(得分:2)

如果有帮助,该行

var hello = new Function('alert("Hello, World!");');

基本相同
var hello = function() { alert("Hello, World!"); };

......除了绑定之外的一些并发症。在实践中,几乎没有任何理由使用new Function(...)

您可以使用以下几个选项来判断您正在处理的对象类型:

  • typeof提供了相当重要的指示(在这种情况下,"object""function")。

  • Object.prototype.toString.call(whatever)为您提供更多信息(针对规范定义的对象),为您提供[object Object][object Function][object Array]等字符串。

更多内容在我的博文Say what?中,其中涉及了解JavaScript中的内容(以及您实际上很少需要的内容)。