如何将变量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();
答案 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();