Javascript 是否可以创建更具动态性的新类型?

Javascript 是否可以创建更具动态性的新类型?,javascript,Javascript,可能不是正确的词。但是我想用JavaScript创建一个新类型。它有一个简单的特性,可以做到这一点: var inst = new SomeType(); inst.key1.key2 = 'something'; inst.key1.key1.key3 = 'something'; 基本上,您不必声明对象文字来进一步扩展。它会自动创建一个 这将允许我构建复杂的结构,而不必担心检查是否存在要扩展的属性 而不是做 inst.key1 = {}; inst.key1.key2 = 'data';

可能不是正确的词。但是我想用JavaScript创建一个新类型。它有一个简单的特性,可以做到这一点:

var inst = new SomeType();
inst.key1.key2 = 'something';
inst.key1.key1.key3 = 'something';
基本上,您不必声明对象文字来进一步扩展。它会自动创建一个

这将允许我构建复杂的结构,而不必担心检查是否存在要扩展的属性

而不是做

inst.key1 = {};

inst.key1.key2 = 'data';
你可以这么做

inst.key1.key2 = 'data';

inst.key1 = {};
将是自动的,即将在内部发生

这是有实际意义的。特别是我有一个注册表模式,我将使用这种新类型以更分层的方式组织数据

此外,我还看到了一种在库中很常见的模式,它测试对象文字是否存在,如果不存在,则创建一个对象文字


这似乎是一个常见的习惯用法。

您想要得到的东西可以通过()轻松实现但是,这个API还不稳定,所以可以在非关键的业余爱好代码中使用它,但不要在生产代码中使用它(现在)

下面是一个非常简单的例子:

函数getFreeChain(对象){
变量处理程序={
get:函数(目标、名称){
如果(目标中的名称)
返回目标[名称];
var newTarget=target[name]={};
返回新代理(newTarget,handler);
}
};
返回新代理(对象、处理程序);
}
//用法:
var obj={};
var magicalObj=getFreeChain(obj);
magicalObj.a.b.c.d.e.g=1;
控制台日志(magicalObj.a.b.c.d.e.g);//1.
控制台日志(obj.a.b.c.d.e.g);//1.
obj.x.y.z=1;//类型错误:obj.x未定义
注意:我的示例是最新的
Proxy
规范的实现,该规范仅受Firefox支持。 Chrome只支持一个,可以通过在
chrome://flags/
。这个旧API很难看,实现前一个API需要大量代码行,所以我将把它作为练习留给读者


哦,有一个名为(被取代)的库,它将简单的代理API引入到Chrome中。在包含这个库之后,前面的代码将在Firefox和Chrome中工作(启用了实验):

因为javascript不支持操作符重载,所以可以创建一个真正丑陋的伪操作符,称为
。如果有人想要实现
请编辑答案


仅供参考,这在Perl中称为自动识别。它的音节数与您的用户名相同:p这是不可能的(目前)。您无法侦听所有可能属性的读取。即使使用getter也不行。如果不使用某种方法,这是不可能的。然而,我可以想象Coffeescript的存在运算符被扩展以允许这种功能。(仔细想想,这是个不错的主意……)我用
发布了一个非常难看的答案。。。在下面
var Obj = function () {
    this.hold = {};
};

Obj.prototype._ = function (key) {
    //implement here;
    return this;
};

var obj = new Obj();

obj._('key1')._('key2')._('key3') = 'barbarella';
console.log(test);