JavaScript 只允许将函数用作对象的构造函数。
如果我们有这个:
function Foo() {
this.bar = "bar";
}
var b = new Foo();
alert(b.bar); "bar"
我们使用该Foo
函数作为构造函数创建了一个新对象。在对象的创建中加入一些逻辑很方便。
它还允许您设置继承的值。通过向 的.prototype
对象添加属性Foo
,您创建的新对象将继承这些属性。
function Foo() {
this.bar = "bar";
}
Foo.prototype.alertBar = function() {
alert(this.bar);
}
var b = new Foo();
b.alertBar();
所以现在b
对象自动继承该alertBar
方法,即使它没有在对象上显式定义。
绝对不需要将函数用作构造函数。如您所知,您可以只使用文字语法来创建单个对象。
您也可以在不使用构造函数的情况下设置继承。假设您想要一些对象都应该从一组值继承。您可以使用Object.create
.
var base = {
foo: "bar"
};
现在,如果我们使用来创建新对象,并且如果我们作为第一个参数Object.create
传递,那么新对象将继承自.base
base
var a = Object.create(base);
var b = Object.create(base);
var c = Object.create(base);
a.foo; // "bar"
b.foo; // "bar"
所以你看到我们可以在没有构造函数的情况下创建对象,但仍然可以获得原型继承的好处。
最后,您可以将函数与普通对象结合起来创建新对象,而无需实际使用函数作为典型的构造函数。为此,您只需让函数返回一个使用文字语法创建的对象。
var fooMaker = (function() {
var getBar = function() {
return this.bar;
};
return function fooMaker() {
return {
bar: "bar",
getBar: getBar
};
};
})();
var f = fooMaker();
f.getBar(); // "bar"