Javascript ES6“代理解决方案”;TypeError:无法创建以非对象作为目标的代理";?

Javascript ES6“代理解决方案”;TypeError:无法创建以非对象作为目标的代理";?,javascript,object,inheritance,reflection,functional-programming,Javascript,Object,Inheritance,Reflection,Functional Programming,最后一个问题是: 有很多很好的回应,其中一位建议在JavaScript中实现某种类型的类型结构: const TYPE=Symbol(); 常量typeOf=t=>x=>x==null ? x :Object.assign(x{ [类型]:t }); 常量isType=t=>x=>x==null ? 假的 :x[类型]==t; 常量Foo=x=>typeOf(Foo)(x); console.log( isType(Foo)(1)//错误 ,isType(Foo)([])//false ,i

最后一个问题是:

有很多很好的回应,其中一位建议在JavaScript中实现某种类型的类型结构:

const TYPE=Symbol();
常量typeOf=t=>x=>x==null
? x
:Object.assign(x{
[类型]:t
});
常量isType=t=>x=>x==null
? 假的
:x[类型]==t;
常量Foo=x=>typeOf(Foo)(x);
console.log(
isType(Foo)(1)//错误
,isType(Foo)([])//false
,isType(Foo)({})//false
,isType(Foo)(x=>x)//false
,isType(Foo)(真)//假
,isType(Foo)(未定义)//false
,isType(Foo)(null)//false
);
console.log(
isType(Foo)(Foo(1))//true
,isType(Foo)(Foo([])//true
,isType(Foo)(Foo({}))//true
,isType(Foo)(Foo(x=>x))//true
,isType(Foo)(Foo(true))//true
,isType(Foo)(Foo(未定义))//false
,isType(Foo)(Foo(null))//false
);
console.log(Foo(1)+Foo(2))//3.
结果是

  • 符号()
  • Object.assign()
  • 代理
至少在本主题中,不需要实现所有这些功能

请参见下面的我的代码:

const selfAware=i=>i[i]=i;
const isAware=i=>(i[i]==i);
常数I=I=>(I==I)| |(I==null)
? 我
:自我意识(对象(i));
常数amI=i=>(i==i)
? 真的
:(i==null)
? 假的
:isAware(i);
常数ss=I(6);
控制台日志(ss);
console.log(ss[ss]);
//自相似
console.log(ss[ss][ss]);
常数obj1={
a:2
};
常数obj2=I(obj1);
控制台日志(obj1);
console.log(obj2);
console.log(
我(“你好,世界!”).toString()//是的,它能工作!
);
控制台日志(I(1)+I(2))//3.
console.log(
(一) //[功能:I]
);
console.log(
(一) (I)/[功能:I]
);
console.log(
(一) (I)(I)/[职能:I]
);
console.log(
(一) (I)(I)(I)/[职能:I]
);
console.log(“=================================================”);
console.log(
阿美(一)//对
,amI(1)//false
,amI([])//false
,amI({})//false
,amI(x=>x)//false
,amI(true)//false
,amI(false)//false
,amI(未定义)//false
,amI(null)//false
);
console.log(
amI(I(I))//对
,amI(I(1))//真
,amI(I([])//true
,amI(I({}))//true
,amI(I(x=>x))//真
,amI(I(true))//true
,amI(I(false))//true
,amI(I(未定义))//false
,amI(I(null))//false

);对象。分配
,这样它就不会改变原始对象。例如,
Object.assign({},x,{[TYPE]:t})
。在ES2018中,您可以执行
{…x,[TYPE]:t}
@sylvester哇,这根本没有文档记录,并且
{…x,…y}
表示法在当前node.js环境中工作。非常感谢@贝叶斯研究——对我来说似乎有很好的证明。在spec(,它接受你,它说“1.如果Type(target)不是Object,抛出一个TypeError异常。”),“target-要用proxy包装的目标对象(可以是任何类型的对象,包括本机数组、函数甚至其他代理)。”