ObjectPrototype.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Jint.Runtime;
  2. using Jint.Runtime.Descriptors;
  3. using Jint.Runtime.Interop;
  4. namespace Jint.Native.Object
  5. {
  6. public sealed class ObjectPrototype : ObjectInstance
  7. {
  8. private ObjectPrototype(Engine engine) : base(engine)
  9. {
  10. }
  11. public static ObjectPrototype CreatePrototypeObject(Engine engine, ObjectConstructor objectConstructor)
  12. {
  13. var obj = new ObjectPrototype(engine) { Extensible = true };
  14. obj.FastAddProperty("constructor", objectConstructor, false, false, false);
  15. obj.FastAddProperty("toString", new ClrFunctionInstance<object, string>(engine, obj.ToString), false, false, false);
  16. obj.FastAddProperty("hasOwnProperty", new ClrFunctionInstance<object, bool>(engine, obj.HasOwnProperty), false, false, false);
  17. return obj;
  18. }
  19. /// <summary>
  20. /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.2
  21. /// </summary>
  22. /// <param name="thisObject"></param>
  23. /// <param name="arguments"></param>
  24. /// <returns></returns>
  25. public string ToString(object thisObject, object[] arguments)
  26. {
  27. if (thisObject == Undefined.Instance)
  28. {
  29. return "[object Undefined]";
  30. }
  31. if (thisObject == Null.Instance)
  32. {
  33. return "[object Null]";
  34. }
  35. var o = TypeConverter.ToObject(Engine, thisObject);
  36. return "[object " + o.Class + "]";
  37. }
  38. /// <summary>
  39. /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.5
  40. /// </summary>
  41. /// <param name="thisObject"></param>
  42. /// <param name="arguments"></param>
  43. /// <returns></returns>
  44. public bool HasOwnProperty(object thisObject, object[] arguments)
  45. {
  46. var p = TypeConverter.ToString(arguments[0]);
  47. var o = TypeConverter.ToObject(Engine, thisObject);
  48. var desc = o.GetOwnProperty(p);
  49. return desc != PropertyDescriptor.Undefined;
  50. }
  51. }
  52. }