将对象转换为函数

时间:2016-06-06 15:10:47

标签: javascript function object

如何将变量param传递给函数? 我的例子不起作用。 'run'函数抛出一个错误='param未定义'

        var newClass = function (obj) {
            var param = "the param";
            var f = function (param) { };
            f.prototype = obj;
            return nf = new f(param);
        };

        var Runner = {
            run: function () {
                console.log("calling method run " + param);

            }
        };

        var nf = newClass(Runner);
        nf.run();

2 个答案:

答案 0 :(得分:3)

您的目标似乎是让newClass返回一个使用Runner作为其原型并且param作为属性的对象。有一种非常简单的方法可以做到这一点;见评论:

var newClass = function(obj) {
    // Create an object using `obj` as its prototype
    var nf = Object.create(obj);

    // Give it a `param` property
    nf.param = "the param";

    // Return it
    return nf;
};

var Runner = {
    run: function() {
        // Note the use of `this `on the next line, to access
        // the property in the instance
        console.log("calling method run " + this.param);
    }
};

var nf = newClass(Runner);
nf.run();

在ES5中添加了

Object.create(2009年),因此几乎任何模糊的JavaScript引擎都存在(因此,不是IE8中的那个);上面的单参数版本可以使用与您的问题非常相似的代码进行填充,请参阅MDN

完全 ES5兼容的JavaScript引擎上,您可以使用Object.create的第二个参数(无法对其进行填充/填充)来控制其可枚举性,可写性和可配置性。属性:

var newClass = function(obj) {
    // Create and return an object using `obj` as its prototype,
    // with a `param` property:
    return Object.create(obj, {
        param: {
            value: "the param"
        }
    });
};

在该示例中,param将是不可枚举的,只读的,不可配置的。

旁注:我不会调用创建新对象newClass的函数,只是FWIW。 : - )

你在评论中说过:

  

我的目标是生成一个私有变量,只能从Runner内部访问。在您的示例中,可以从外部访问param。

如果是这样,你不能在Runner函数之外定义newClass,因为根据定义,这是...... newClass函数之外的。

可以做的是在run中定义newClass,也许让它转过来调用接受param作为参数的Runner上的函数:

var newClass = function(obj) {
    // The private variable
    var param = "the param";
  
    // Create an object using `obj` as its prototype
    var nf = Object.create(obj);
  
    // Create `run`
    nf.run = function() {
        this.runWithParam(param)
    };

    // Return it
    return nf;
};

var Runner = {
    runWithParam: function(param) {
        console.log("calling method runWithParam " + param);
    }
};

var nf = newClass(Runner);
nf.run();

......或者可能根本不使用Runner作为原型:

var newClass = function(runner) {
    // The private variable
    var param = "the param";
  
    // Create an object with `run` on it
    var nf = {
        run: function() {
            return runner.runWithParam(param);
        }
    };

    // Return it
    return nf;
};

var Runner = {
    runWithParam: function(param) {
        console.log("calling method runWithParam " + param);
    }
};

var nf = newClass(Runner);
nf.run();

答案 1 :(得分:0)

你可以使用你最初想要的构造函数,但是如果你想从实例化对象访问param,那么它必须是实例化对象或构造函数原型的属性。 。我选择将它放在构造函数的原型中(我的意思是作为参数提供的obj对象,后来被指定为构造函数F的原型)。

当然,为了通过对象方法访问属性,我们必须使用指定调用该方法的父类来引用它们。这是this



var newClass = function (obj) {
                 var     F = function () { };
                 obj.param = "the param";
                 F.prototype = obj;
                 return new F();
               };

var Runner = { run: function () {
                      console.log("calling method run " + this.param);
                    }
             };

var nf = newClass(Runner);
nf.run();