是否可以将构造函数放在另一个构造函数内的构造函数中?

时间:2017-06-01 16:57:22

标签: javascript constructor

我正在创建一个可以将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。感谢您的帮助!]

编辑:感谢所有评论者的帮助。 ;)

2 个答案:

答案 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不起作用。