3

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

二传手:

props.Property(name) = val;

吸气剂:

val = props.Property(name);

您需要实例化哪些设置器才能如上运行?

编辑:不太简单,此代码已在框架内的 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) { }
            }
    };

提前致谢,

4

3 回答 3

8

我认为这可能只是一些奇怪的旧JScript语法。从评论中避开“内部函数返回引用”的想法,我发现了一个关于JavaScript 和 JScript 之间差异的问题,列出的唯一语法差异是这个:

成语 f(x) = y,大致等价于 f[x] = y。

虽然没有太多关于这个成语的发现。然而,这本关于 Jscript.Net的书简要提到了

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

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

于 2013-09-17T00:49:44.663 回答
3

上面的代码包含在一个静默的 try catch 块中,因此它可能看起来运行成功,但实际上并非如此。

catch尝试在块中记录捕获的异常。如果这一行,你应该得到一个 ReferenceError:

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

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

于 2013-09-16T22:42:06.350 回答
1

这种二传手方法行不通。无论函数返回什么,如果您将函数调用用作赋值表达式的唯一表达式左侧(LHS),您将得到

ReferenceError:分配中的左侧无效

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

这种吸气剂方法可以工作。但是,如果您想要 getter 和 setter,最迟在 ECMAScript Edition 5 的一致实现中,您可以在本地拥有它

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”——</p>

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);

(如您所见,良好的代码风格对理解代码有很大帮助)

于 2013-09-16T23:39:01.010 回答