我正在调查我范围之外的一些代码,这些代码是以我以前从未见过的风格编写的。我试图理解以下属性包的内部工作原理:
设置器:
props.Property(name) = val;
吸气剂:
val = props.Property(name);
你需要实例化setter以便如上所述运行?
编辑:简化程度较低,此代码在框架内的BrowserWindow上成功运行(类似于手机环境)。
var UI =
{
ready: function(oProps)
{
try
{
if (oProps)
{
window.external.Property(UI.FrameWidth) = '1000';
window.external.Property(UI.FrameHeight) = '900';
}
window.external.Ready();
}
catch (e) { }
}
};
提前致谢,
答案 0 :(得分:8)
我认为这可能只是一些奇怪的旧 JScript 语法。从评论中转离“内部函数返回参考”的想法,我发现了一个关于differences between JavaScript and JScript的问题,列出的唯一语法差异就是这个:
成语f(x)= y,大致相当于f [x] = y。
虽然没有太多关于这个成语的发现。但是,this book about Jscript.Net简要提到了
您可以使用方括号或括号访问任何expando属性。
“expando”似乎是允许您添加动态属性的类的修饰符。
答案 1 :(得分:3)
上面的代码包含在一个静默的try catch块中,因此它可能似乎成功运行但实际上并非如此。
尝试在catch
块中记录捕获的异常。如果这一行你应该得到一个ReferenceError:
window.external.Property(UI.FrameWidth) = '1000';
被击中(当然这取决于oProps
的值)。
答案 2 :(得分:1)
这种setter方法不起作用。无论函数返回什么,如果您使用函数调用作为赋值表达式的唯一表达式左侧(LHS),您将获得
ReferenceError:赋值中的左侧无效
之类的。正如其他人所说,你没有看到ReferenceError
异常,因为它被抛出并且没有代码可以处理它。函数是第一类对象,但调用对它们来说不是 valid LHS values。如果您在console.log(e);
块中插入catch
,您会清楚地看到。
这种getter方法可行。但是,如果你想要getter和setter,最迟在ECMAScript Edition 5 you can have that natively的符合实现中:
Object.defineProperty(props, "name", (function () {
var _value;
return {
set: function (value) {
/* setter code, simple example */
_value = String(value);
},
get: function () {
/* getter code, simple example */
return _value;
}
};
}()));
/* triggers the setter */
props.name = 42;
/* triggers the getter */
var x = props.name;
/* "42" */
x
“编辑2” -
var someObjs = [{a:"",someProp:"b"}];
(function (a) { return someObjs[a]})(0).someProp = "c";
console.log(someObjs[0].someProp);
- 因为该函数的返回值使用LHS,但作为另一个表达式的一部分,其值为属性访问(使用点属性访问器语法) 。该函数返回对对象的引用(到Object
实例),然后访问其属性。属性访问是赋值表达式的LHS,RHS值("c"
)被分配给该属性。
它在功能上等同于
var someObjs = [
{a: "", someProp: "b"}
];
(function () {
return someObjs[0];
}()).someProp = "c";
console.log(someObjs[0].someProp);
因此
someObjs[0].someProp = "c";
console.log(someObjs[0].someProp);
(正如您所看到的,良好的代码风格对理解代码有很大帮助)