我了解到可以在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!");');
那么如果它们以相同的方式声明,我怎么能知道函数中的对象呢?
答案 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中的内容(以及您实际上很少需要的内容)。