JavaScript:属性描述符在传递给函数时被忽略
我想将getter/setter传递给函数,但不能。甚至可以在JS中做(或模仿)这样的事情吗 我试着用getter/setter调用一个函数,但它(很明显)不起作用,我试过“apply”和“call”,但它仍然(不知何故)不起作用JavaScript:属性描述符在传递给函数时被忽略,javascript,arguments,descriptor,function-call,propertydescriptor,Javascript,Arguments,Descriptor,Function Call,Propertydescriptor,我想将getter/setter传递给函数,但不能。甚至可以在JS中做(或模仿)这样的事情吗 我试着用getter/setter调用一个函数,但它(很明显)不起作用,我试过“apply”和“call”,但它仍然(不知何故)不起作用 function foo(x, y) { var i; for (i = 0; i < 5; ++i) console.log(x, y); } var args = []; Object.defineProperties(args, {
function foo(x, y) {
var i;
for (i = 0; i < 5; ++i)
console.log(x, y);
}
var args = [];
Object.defineProperties(args, {
"0": {
"set": function() { },
"get": Math.random
},
"1": {
"set": function() { },
"get": function() { return new Date().getMilliseconds(); }
}
});
foo.apply(this, args);
函数foo(x,y){
var i;
对于(i=0;i<5;++i)
控制台日志(x,y);
}
var args=[];
对象。定义属性(参数{
"0": {
“set”:函数(){},
“get”:Math.random
},
"1": {
“set”:函数(){},
“get”:函数(){returnnewdate().getmillizes();}
}
});
foo.apply(本,args);
预期有5个不同的结果,但得到了5个相同的结果。问题在于
.apply
将“数组”转换为参数
对象,因此您的访问器只会被评估一次
通过直接将数组传递给函数,可以使示例正常工作:
函数foo(arr){
对于(变量i=0;i<5;++i)
console.log(arr[0],arr[1]);
}
var args=[];
对象。定义属性(参数{
"0": {
“set”:函数(){},
“get”:Math.random
},
"1": {
“set”:函数(){},
“get”:函数(){returnnewdate().getmillizes();}
}
});
foo(args)代码>不,这是不可能的。将args
数组转换为apply
中的单个值列表,然后将值本身作为参数传递
函数参数永远不会显示getter功能。有很多方法可以使特定作用域中的标识符充当getter/setter,但是您永远不应该这样做,而且无论如何都需要在函数内部这样做
您最好的选择是为x
和y
参数使用函数,并在foo
中显式调用它们,我可能会有误解,但在我看来,当您通过apply
方法将args
传递给foo
时,该程序将为x
和y
生成随机值-但一旦进入foo
,这些参数将被固定,而foo
只需打印出这些固定值5次。如果连续几次执行foo.apply(null,args)
(这里foo
中的循环是不相关的),那么我想每次都会得到不同的结果。顺便说一句,在ES6中,调用foo(…args)
比使用apply
yes更惯用,这或多或少就是我在评论中想说的。我还没有尝试过这段代码,还没有足够的信心将其转化为答案:)