EnumeratingWithES5.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. var propName = "d";
  6. var propValue = "dvalue";
  7. function CreateSimpleTypeHandlerObject()
  8. {
  9. var obj = Object.create(null);
  10. obj[propName] = propValue;
  11. return obj;
  12. }
  13. function CreateSimpleDictionaryTypeHandlerObject()
  14. {
  15. var obj = {};
  16. obj[propName] = propValue;
  17. return obj;
  18. }
  19. function CreateDictionaryTypeHandlerObject()
  20. {
  21. var obj = {};
  22. Object.defineProperty(obj, propName,
  23. {
  24. get : function() {},
  25. configurable : true,
  26. enumerable : true
  27. });
  28. delete obj[propName];
  29. obj[propName] = propValue;
  30. return obj;
  31. }
  32. function TestNonWritable(o)
  33. {
  34. var beforeTestValue = null;
  35. var value = 1;
  36. value = TestEnumerations(o, beforeTestValue, value);
  37. SetWritable(o, propName, false);
  38. value = TestEnumerations(o, beforeTestValue, value);
  39. SetWritable(o, propName, true);
  40. value = TestEnumerations(o, beforeTestValue, value);
  41. WScript.Echo("Changing writability during enumeration...");
  42. beforeTestValue = function(o, i, value)
  43. {
  44. SetWritable(o, propName, false);
  45. return value;
  46. };
  47. value = TestEnumerations(o, beforeTestValue, value);
  48. beforeTestValue = function(o, i, value)
  49. {
  50. SetWritable(o, propName, true);
  51. return value;
  52. };
  53. value = TestEnumerations(o, beforeTestValue, value);
  54. WScript.Echo("Freezing object");
  55. Object.freeze(o);
  56. beforeTestValue = null;
  57. value = TestEnumerations(o, beforeTestValue, value);
  58. }
  59. function TestAccessors()
  60. {
  61. var o = { a:"aValue" };
  62. DefineAccessor(o, 'b',
  63. function() { return "GETTER FOR b"; },
  64. function(v) { WScript.Echo("SETTER FOR b"); }
  65. );
  66. o.c = "cValue"; // to be deleted
  67. o.d = "dValue";
  68. // Throw in a non-enumerable property
  69. Object.defineProperty(o, 'e',
  70. {
  71. value : "eValue",
  72. configurable : true,
  73. writable : true,
  74. enumerable : false
  75. });
  76. DefineAccessor(o, 'f',
  77. function() { return "GETTER FOR f"; },
  78. function(v) { WScript.Echo("SETTER FOR f"); }
  79. );
  80. o.g = "gValue";
  81. delete o.c;
  82. var value = 1;
  83. var beforeTestValue = null;
  84. value = TestEnumerations(o, beforeTestValue, value);
  85. DefineAccessor(o, propName);
  86. value = TestEnumerations(o, beforeTestValue, value);
  87. DefineDataProperty(o, propName, value++);
  88. value = TestEnumerations(o, beforeTestValue, value);
  89. WScript.Echo("Defining accessor property during enumeration...");
  90. beforeTestValue = function(o, i, value)
  91. {
  92. if (i === propName) DefineAccessor(o, propName);
  93. return value;
  94. };
  95. value = TestEnumerations(o, beforeTestValue, value);
  96. WScript.Echo("Defining data property during enumeration...");
  97. beforeTestValue = function(o, i, value)
  98. {
  99. if (i === propName) DefineDataProperty(o, propName, value);
  100. return value + 1;
  101. };
  102. value = TestEnumerations(o, beforeTestValue, value);
  103. }
  104. function SetWritable(o, p, v)
  105. {
  106. WScript.Echo("Setting writability of " + p + " to " + v);
  107. Object.defineProperty(o, p, { writable : v });
  108. }
  109. function DefineAccessor(o, p, getter, setter)
  110. {
  111. if (!getter) getter = function() { return "GETTER"; };
  112. if (!setter) setter = function(v) { WScript.Echo("SETTER"); }
  113. WScript.Echo("Defining accessors for " + p);
  114. Object.defineProperty(o, p,
  115. {
  116. get : getter,
  117. set : setter,
  118. configurable : true,
  119. enumerable : true
  120. });
  121. }
  122. function DefineDataProperty(o, p, v)
  123. {
  124. WScript.Echo("Defining data property " + p + " with value " + v);
  125. Object.defineProperty(o, p,
  126. {
  127. value : v,
  128. writable : true,
  129. configurable : true,
  130. enumerable : true
  131. });
  132. }
  133. function TestEnumerations(o, beforeTestValue, value)
  134. {
  135. WScript.Echo("Testing for-in enumeration");
  136. for (var i in o)
  137. {
  138. if (beforeTestValue) value = beforeTestValue(o, i, value);
  139. TestValue(o, i, value++);
  140. }
  141. WScript.Echo("Testing getOwnPropertyNames enumeration");
  142. var names = Object.getOwnPropertyNames(o);
  143. for (var i = 0; i < names.length; i++)
  144. {
  145. if (beforeTestValue) value = beforeTestValue(o, i, value);
  146. TestValue(o, names[i], value++);
  147. }
  148. return value;
  149. }
  150. function TestValue(o, i, value)
  151. {
  152. WScript.Echo(i + ": " + o[i]);
  153. WScript.Echo("Setting value to " + value);
  154. o[i] = value;
  155. WScript.Echo(i + ": " + o[i]);
  156. }
  157. WScript.Echo("Test 1: Non-writable, simple type handler");
  158. TestNonWritable(CreateSimpleTypeHandlerObject());
  159. WScript.Echo("");
  160. WScript.Echo("Test 2: Non-writable, simple dictionary type handler");
  161. TestNonWritable(CreateSimpleDictionaryTypeHandlerObject());
  162. WScript.Echo("");
  163. WScript.Echo("Test 3: Non-writable, dictionary type handler");
  164. TestNonWritable(CreateDictionaryTypeHandlerObject());
  165. WScript.Echo("");
  166. WScript.Echo("Test 4: Accessors");
  167. TestAccessors();