我编写的函数将对象作为唯一参数,我自然需要此对象遵循特定的对象规范(它具有哪些属性,类型等)。
我没有将它作为对象文字传递并在函数中进行所有检查,而是想写一个“构造函数”函数,您传递该文字对象,并且执行所有执行对象规范的工作,并在必要时提供默认值。
不会使用new
调用此函数,因为它不需要原型继承。返回对象可能包含一个特殊属性(示例中为_isAPoint
),以“证明”对象已正确构造(替换为instanceof
)。
我不记得曾经见过这种方法。乍一看,它似乎是一种创建有效参数对象的简洁方法,同时避免了原型继承的整个机制。
你怎么看?这是一个确定的模式吗?你能指出我可能存在的缺点和改进吗?简化示例:
var Point = function (opts) {
"use strict";
var defaults = {
color: "blue",
x: 0
};
opts = $.extend(defaults, opts); // (using jQuery's extend)
if (!isNan x) {
throw new Error("x must be a number");
}
return {
_isAPoint: true,
color: opts.color,
x: opts.x
};
};
这样称呼:
someNiceMap.addPoint(Point({ x: 2, color: "red" });
someNiceMap.addPoint(Point({ x: 14 });
答案 0 :(得分:1)
您展示的内容称为工厂方法模式。
这种方法没有根本缺陷,它被认为是构造函数模式的替代方法。
这两种方法的优缺点在Eric Elliot的博客文章中提供:
http://ericleads.com/2013/01/javascript-constructor-functions-vs-factory-functions/
正如您所看到的,唯一重要的缺点是无法使用this
来引用新创建的对象。
但这是一个缺点吗?请注意,Eric以反对构造函数而着称工厂方法而闻名。
要使代码更清晰,请将工厂方法设为显式:
var point = {
create : function( opts ) {
...
return {
_isAPoint: true,
color: opts.color,
x: opts.x
};
}
}
电话现在更清洁了:
someNiceMap.addPoint( point.create( ... ) );