可能不是正确的词。但我想用 JavaScript 创建一个新类型。它具有一个简单的属性,可以做到这一点:
var inst = new SomeType();
inst.key1.key2 = 'something';
inst.key1.key1.key3 = 'something';
基本上,您不必声明对象文字即可进一步扩展。它会自动创建一个。
这将使我能够构建复杂的结构,而不必担心检查是否存在要扩展的属性。
而不是做
inst.key1 = {};
inst.key1.key2 = 'data';
一个人可以做
inst.key1.key2 = 'data';
and the
inst.key1 = {};
将是自动的,即会在内部发生。
这确实有一个实际目的。特别是我有一个注册表模式,我将使用这种新类型来使用更加分层的方法来组织数据。
另外,我看到一种在库中常见的模式,它测试对象文字是否存在,然后在不存在时创建一个。
这似乎是一个常见的习语。
您想要得到的东西可以轻松实现和谐代理 http://wiki.ecmascript.org/doku.php?id=harmony%3aproxies (MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). However,这个 API 还不稳定,所以可以在非关键爱好代码中使用它,但不要在生产代码中使用它(还)。
这是一个非常简单的例子:
function getFreeChain(object) {
var handler = {
get: function(target, name) {
if (name in target)
return target[name];
var newTarget = target[name] = {};
return new Proxy(newTarget, handler);
}
};
return new Proxy(object, handler);
}
// Usage:
var obj = {};
var magicalObj = getFreeChain(obj);
magicalObj.a.b.c.d.e.g = 1;
console.log(magicalObj.a.b.c.d.e.g); // 1
console.log(obj.a.b.c.d.e.g); // 1
obj.x.y.z = 1; // TypeError: obj.x is undefined
注意:我的例子是最新的实现Proxy
规范,仅 Firefox 支持。
Chrome 仅支持旧的、显着不同的 API 版本 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Old_Proxy_API,可以通过打开“实验性 JavaScript”来启用chrome://flags/
。这个旧的 API 很丑陋,实现以前的 API 需要更多的代码行,所以我将把它作为练习留给读者。
哦,有一个图书馆叫DirectProxies.js https://code.google.com/p/es-lab/source/browse/trunk/src/proxies/DirectProxies.js(取代和谐反映 https://github.com/tvcutsem/harmony-reflect)这为 Chrome 带来了简单的代理 API。包含该库后,之前的代码将在 Firefox 和 Chrome 中运行(启用实验):http://jsfiddle.net/PAhYL/ http://jsfiddle.net/PAhYL/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)