Javascript 新的JS库,如何改进?
我正在尝试改进我开始编写的一个小型库:Javascript 新的JS库,如何改进?,javascript,Javascript,我正在尝试改进我开始编写的一个小型库: var syn=(function(){ var container = {}; return function(variable){ return{ val: container[variable], is: function(value){ container[variable] = value;
var syn=(function(){
var container = {};
return function(variable){
return{
val: container[variable],
is: function(value){
container[variable] = value;
}
};
};
})();
目前,它能够使用语法syn(“a”).is(42)存储信息片段
并使用syn(“a”).val返回值
我希望能够用这个库做两件事:
我希望能够创建syn对象的新实例,以便创建多个“突触”。e、 g.,var SynapseA=new syn代码>
我想将syn(“a”).val
简化为syn(“a”)
,这样,如果我引用syn(“a”)
而没有属性或方法,它将返回与syn(“a”).val等价的值,但我不知道如何实现
感谢您的帮助……这将满足您的要求,我认为:
var syn = function() {
this.container = {};
}
syn.prototype.is = function(index, value){
this.container[index] = value;
}
syn.prototype.val = function(index){
return this.container[index];
}
我可以做到以下几点:
var synapseA = new syn();
synapseA.is("a", 42);
console.log(synapseA.val("a"));
var synapseB = new syn();
synapseB.is("a", 30);
console.log(synapseB.val("a"));
synapseB.is("b", 20);
console.log(synapseB.val("b"));
我得到42、30和20个注销。这就是你想要的吗?你想要的是不可能的,因为它在某种程度上是矛盾的:
我想将syn(“a”).val
简化为syn(“a”)
,这样,如果我引用syn(“a”)
而没有属性或方法,它将返回与syn(“a”)等价的值。val
假设这是可能的,并且为“a”存储的值是42,如您的示例所示,那么以下两个表达式都需要返回42:
syn("a")
syn("a").val
但是如果第一个返回42,那么第二个就不能工作:42没有属性val
。如果第二个有效,那么第一个必然会返回一个具有val
属性的对象,这显然不是42。所以这是一个矛盾
在我看来,最接近您想要的是依赖于特殊的valueOf
方法,当您强制强制使用某个数字(或布尔值)时,该方法将起作用。但是,要使其起作用,您必须假设存储的值实际上是数字
以下是它的工作原理:
函数Syn(){//构造函数,因此可以创建多个Syn对象
var容器={};
var f=函数(变量){
返回{
valueOf:function(){//特殊方法
返回容器[变量];
},
val:容器[变量],
赋值:函数(值){
容器[变量]=值;
}
}
};
//如果您确实需要退货,请仅包括下一行
//要视为Syn实例的对象:
setPrototypeOf(f,Object.getPrototypeOf(this));
返回f;
}
var syn=新的syn();
console.log(syn instanceof syn);//真的
综合(“a”)。转让(42);
console.log(syn(“a”).val);//42
console.log(+syn(“a”);//42,因为'syn(“a”)`被强制为number
,奇怪的是,当容器是一个对象时,您正在索引处访问容器。这对我来说毫无意义。它真的有效吗?对我来说是一个平等测试,而不是一个设定者。我真的建议你重新命名这个。另外,您希望如何使用新的getter语法?如果syn(“a”)
返回值,它就不能同时返回带有is
方法的对象。container[variable]
如果你注意到括号(按照惯例,如果它能工作,那么我不完全理解JS中对象的工作方式),那就是数组。示例:container[1]
您正在访问索引1处container处的对象。访问对象的方式更像是container.objectName
。对你的问题毫无帮助,只是我注意到了一些事情。看起来很奇怪,但如果它起作用的话,我肯定有一个合理的理由。如果我在没有属性或方法的情况下引用syn(“a”)
,它将返回与syn(“a”).val等价的值:这是不可能的,因为第一个表达式将始终需要支持.val
属性,以便第二个表达式可以工作。想想a=syn(“a”);console.log(a.val)代码>:应该可以,但是a
不能完全是值,因为它必须具有val
属性。在@Bergi和trincot的基础上构建,如果用户执行syn(“a”)。is(42)
,则执行syn(“a”)。is(1)
,这将引发错误,因为数字42没有is
方法。为什么要将容器
从对象更改为数组?如果存储的值可以是任何值,不仅仅是一个数字?我只知道另一个变体:toString
,当您强制将存储值转换为字符串时,它将始终返回该值的字符串版本,就像向其添加另一个(可能为空)字符串一样。见我的补充答案。如果您正在寻找一种方法来返回与之前存储的数据类型相对应的数据类型:通过强制是不可能的,根据定义,强制作用于一种特定的数据类型。强制是“无声地”将一个值转化为原始“等价物”的唯一方法。这就是为什么我开始这样回答的原因