public static JsTypeFunction Define(string name, JsTypeFunction prototype) { JsTypeFunction typeFunction = null; // Create constructor function, which is a superconstructor that takes in the actual // constructor as the first argument, and the rest of the arguments are passed directly // to that constructor. These subconstructors are not Javascript constructors -- they // are not called via new, they exist for initialization only. typeFunction = Jsni.function(constructor => { if (constructor != null || !(Jsni.instanceof(Jsni.@this(), typeFunction))) { Jsni.invoke(Jsni.member(typeFunction, SpecialNames.StaticInitializer)); } if (constructor != null) { Jsni.apply(constructor, Jsni.@this(), Jsni.call(Jsni.reference("Array.prototype.slice"), Jsni.arguments(), 1.As < JsObject > ()).As <JsArray>()); } if (!Jsni.instanceof(Jsni.@this(), typeFunction)) { return(typeFunction); } else { return(Jsni.@this()); } }).As <JsTypeFunction>(); Jsni.memberset(typeFunction, "toString", Jsni.function(() => name.As <JsObject>())); Jsni.memberset(typeFunction, SpecialNames.TypeName, name.As <JsString>()); Jsni.memberset(typeFunction, "prototype", Jsni.@new(prototype)); return(typeFunction); }
public static JsFunction CreateDelegate(JsObject thisExpression, JsFunction lambda, JsTypeFunction delegateType = null, string delegateKey = null) { delegateType = delegateType ?? Jsni.reference("System.Delegate").As <JsTypeFunction>(); JsFunction delegateFunc = null; delegateFunc = Jsni.function(() => { return(lambda.apply(delegateFunc.As <Delegate>().Target.As <JsObject>(), Jsni.arguments().As <JsArray>())); }); delegateFunc.prototype = Jsni.@new(delegateType); delegateFunc.memberset("get_Target", Jsni.function(() => thisExpression)); delegateFunc.memberset("GetType", Jsni.function(() => delegateType.GetTypeFromType.invoke())); Jsni.memberset(delegateFunc, SpecialNames.TypeField, delegateType); Jsni.memberset(delegateFunc, "Invoke", delegateFunc); Jsni.memberset(delegateFunc, "DynamicInvoke", Jsni.function(args => delegateFunc.apply(delegateFunc, args.As <JsArray>()))); Jsni.memberset(delegateFunc, "GetHashCode", Jsni.function(() => lambda.toString().GetHashCode().As <JsObject>())); Jsni.memberset(delegateFunc, "lambda", lambda); Jsni.memberset(delegateFunc, "Equals", Jsni.function(x => x != null && lambda == x.member("lambda"))); return(delegateFunc); }
public static JsFunction CreateDelegate(JsObject thisExpression, JsTypeFunction delegateType, JsFunction lambda, string delegateKey = null) { if (delegateKey != null) { if (thisExpression[delegateKey]) { return(thisExpression[delegateKey].As <JsFunction>()); } } else { if (lambda.member("$delegate") != null) { return(lambda.member("$delegate").As <JsFunction>()); } } JsFunction delegateFunc = null; delegateFunc = Jsni.function(() => { return(lambda.apply(delegateFunc.As <Delegate>().Target.As <JsObject>(), Jsni.arguments().As <JsArray>())); }); delegateFunc.prototype = Jsni.@new(delegateType); Jsni.type <object>().TypeInitializer.invoke(delegateFunc, delegateFunc); Jsni.type <Delegate>().TypeInitializer.invoke(delegateFunc, delegateFunc); Jsni.type <MulticastDelegate>().TypeInitializer.invoke(delegateFunc, delegateFunc); delegateType.TypeInitializer.invoke(delegateFunc, delegateFunc); Jsni.invoke(Jsni.member(Jsni.member(Jsni.type <MulticastDelegate>().prototype, "$ctor"), "call"), delegateFunc, thisExpression, new[] { delegateFunc }.As <JsArray>()); Jsni.memberset(delegateFunc, SpecialNames.TypeField, delegateType); if (delegateKey != null) { thisExpression[delegateKey] = delegateFunc; } else { lambda.memberset("$delegate", delegateFunc); } return(delegateFunc); }