javascript中的属性包

javascript中的属性包,javascript,properties,jscript,Javascript,Properties,Jscript,我正在调查一些超出我范围的代码,这些代码是以我以前从未见过的风格编写的。我试图了解以下属性包的内部工作原理: 塞特: props.Property(name) = val; 吸气剂: val = props.Property(name); 要使setter像上面那样工作,您需要实例化什么 编辑:简化程度较低,此代码在一个框架内的浏览器窗口上成功运行(类似于电话环境) 提前感谢,上面的代码被包装在一个静默的try-catch块中,因此它可能看起来运行成功,但实际上没有 尝试在catch块中记录

我正在调查一些超出我范围的代码,这些代码是以我以前从未见过的风格编写的。我试图了解以下属性包的内部工作原理:

塞特:

props.Property(name) = val;
吸气剂:

val = props.Property(name);
要使setter像上面那样工作,您需要实例化什么

编辑:简化程度较低,此代码在一个框架内的浏览器窗口上成功运行(类似于电话环境)


提前感谢,

上面的代码被包装在一个静默的try-catch块中,因此它可能看起来运行成功,但实际上没有

尝试在
catch
块中记录捕获的异常。如果此行出现以下情况,则应获得ReferenceError:

window.external.Property(UI.FrameWidth) = '1000';

曾经被击中(这当然取决于
oProps
)的值。

这种setter方法无法工作。无论函数返回什么,如果将函数调用用作赋值表达式左侧(LHS)的唯一表达式,则

ReferenceError:赋值中的左侧无效

诸如此类。正如其他人所说,您没有看到
ReferenceError
异常,因为它在抛出时被捕获,并且没有代码来处理它。函数是一级对象,但对它们的调用不是。如果插入
console.log(e),您将清楚地看到这一点
catch
块中

这种getter方法可以工作。但是,如果您需要getter和setter,最迟在ECMAScript Edition 5的一致性实现中:

“编辑2”——

var someObjs = [{a:"",someProp:"b"}];
(function (a) { return someObjs[a]})(0).someProp = "c";
console.log(someObjs[0].someProp);
–之所以有效,是因为函数的返回值用于LHS,但作为计算为属性访问的另一个表达式的一部分(使用点属性访问器语法)。该函数返回对对象的引用(对
对象
实例),然后访问该对象的属性。属性访问是赋值表达式的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);

(正如您所看到的,好的代码风格有助于理解代码)

我认为这可能只是一些奇怪的老语法。从注释中我发现了一个关于“内部函数返回引用”的问题,列出的唯一语法差异是:

习语f(x)=y,大致相当于f[x]=y

不过,关于这个成语没有太多发现。但是,我简要地提到

可以使用方括号或圆括号访问任何expando属性


“”似乎是类的修饰符,允许您添加动态属性。

setter代码看起来不合法
props.Property(name)
不是左值。你确定那是准确的代码吗?函数调用的返回值是一个值,而不是一个引用。这将导致引用错误。您是否尝试使用window.external.Property.toString()查看其函数代码?起初我认为,“可能Property()方法正在返回引用…”然后我看到了这样的情况:如果这确实是代码(并且它在没有引用错误的情况下工作),那么您就找到了我的问题的答案。请在这里详细说明
窗口。外部
环境是什么…感谢您的详细说明。我计划明天了解更多情况,希望这能帮助我理解这是否真的发生了。我想你已经找到了我想要的。目标浏览器正在使用JScript的实现。在最后确定我的答案之前,我会再做一点调查。你说得对。当我看到这个问题时,我实际上试图搜索“JScript和JavaScript之间的差异”,但我所遇到的只是(包括道格拉斯·克罗克福德本人!)说JScript和JavaScript只是名称不同。我想我很快就放弃了调查。Edit:(其中提到了这个差异)隐藏在其他几个答案下面,这些答案是JScript==JavaScript
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);