1

我了解到可以在 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!");');

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

4

2 回答 2

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 也让你能够构建自己的构造函数。这就是我在上面的例子中所做的。

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

于 2013-02-17T16:02:21.547 回答
2

如果有帮助,该行

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

本质上是一样的

var hello = function() { alert("Hello, World!"); };

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

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

  • typeof提供了一个相当粗略的指示(在这种情况下,"object"vs "function".)。

  • Object.prototype.toString.call(whatever)通过(对于规范定义的对象)为您提供更多信息,例如[object Object]or[object Function][object Array].

更多在我的博客文章说什么?它涉及弄清楚 JavaScript 中的内容(以及为什么您实际上很少需要这样做)。

于 2013-02-17T16:04:36.217 回答