在javascript中的属性包

时间:2013-09-16 22:15:41

标签: javascript properties jscript

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

设置器:

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

提前致谢,

3 个答案:

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

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