ObjectPrototype.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. return obj;
  16. }
  17. public void Configure()
  18. {
  19. FastAddProperty("toString", new ClrFunctionInstance<object, string>(Engine, ToString), false, false, false);
  20. FastAddProperty("hasOwnProperty", new ClrFunctionInstance<object, bool>(Engine, HasOwnProperty), false, false, false);
  21. }
  22. /// <summary>
  23. /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.2
  24. /// </summary>
  25. /// <param name="thisObject"></param>
  26. /// <param name="arguments"></param>
  27. /// <returns></returns>
  28. public string ToString(object thisObject, object[] arguments)
  29. {
  30. if (thisObject == Undefined.Instance)
  31. {
  32. return "[object Undefined]";
  33. }
  34. if (thisObject == Null.Instance)
  35. {
  36. return "[object Null]";
  37. }
  38. var o = TypeConverter.ToObject(Engine, thisObject);
  39. return "[object " + o.Class + "]";
  40. }
  41. /// <summary>
  42. /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.5
  43. /// </summary>
  44. /// <param name="thisObject"></param>
  45. /// <param name="arguments"></param>
  46. /// <returns></returns>
  47. public bool HasOwnProperty(object thisObject, object[] arguments)
  48. {
  49. var p = TypeConverter.ToString(arguments[0]);
  50. var o = TypeConverter.ToObject(Engine, thisObject);
  51. var desc = o.GetOwnProperty(p);
  52. return desc != PropertyDescriptor.Undefined;
  53. }
  54. }
  55. }