我正在创建一个可以将Python 3功能添加到JavaScript中的项目。例如," in"。
我的问题是,我可以在构造函数内的构造函数中创建构造函数吗?例如:
var foo = new function foo() {
this.bar = function(Variable1) {
this.def = function() {
// code
}
return ""; // to prevent error with undefined
}
foo和foo.bar(var1)有效,但foo.bar(var1).def没有。我搞砸了它并尝试做foo.def,它起作用了。我很困惑;为什么foo.def
有效,而foo.bar(var1).def
无效?
[我为什么要这样做?我想复制" in"来自Python 3的关键字(如
if (5 in [5, 2, 3]): ... # returns true
),以便在JavaScript中更轻松(for (var i = 0; etc.)
)。在这种情况下,我想做foo.v("h").$in.v2("hello world")
之类的事情返回true。感谢您的帮助!]
编辑:感谢所有评论者的帮助。 ;)
答案 0 :(得分:1)
我想做
之类的事情foo.v("h").$in.v2("hello world")
返回[sic] true
由于您不想将foo
作为构造函数(在您的示例中没有new
),因此您不希望foo
成为一个建设者。让它返回一个具有v
属性的对象,该属性引用一个函数,该函数反过来存储给它的值并返回一个具有$in
属性(可能还有其他)的对象,该对象返回一个函数(函数),具有计算结果的v2
属性。
例如,这些都是相同的对象,但你可以使用不同的对象用于不同的状态;见评论:
// The operations we allow, including how many operands they expect
var operations = {
// We'll just do $in for now
$in: {
operandCount: 2,
exec: function(operands) {
return String(operands[1]).indexOf(String(operands[0])) != -1;
}
}
};
// Prototype of objects returned by `foo`
var proto = {
// `v` sets the next operand; if we have an operation and we have enough
// operands, it executes the operation; if not, returns `this` for chaining
v(operand) {
if (!this.operands) {
this.operands = [];
}
this.operands.push(operand);
if (this.operation && this.operation.operandCount == this.operands.length) {
return this.operation.exec(this.operands);
}
return this;
},
// `$in` is defined as a property with a getter to satisfy your syntax.
// In general, getters with side-effects (like this one) are a Bad Thing™,
// but there can be exceptions... Returns `this` because `$in` is an infix
// operator.
get $in() {
if (this.hasOwnProperty("operation")) {
throw new Error("Cannot specify multiple operations");
}
this.operation = operations.$in;
return this;
}
};
// `foo` just creates the relevant object
function foo() {
return Object.create(proto);
}
// Examples:
console.log("Should be true:", foo().v("h").$in.v("hello world"));
console.log("Should be false:", foo().v("h").$in.v("nope, don't 'ave it"));

答案 1 :(得分:-2)
foo.bar(var1)
,结果应该是函数bar的返回值。函数栏没有返回值,因此foo.bar(var1).def
不起作用。