1. // super 4种遍历方式 原型 symbol 遍历.js
    2. function Person (){
    3. this.name = "zhangsan";
    4. this.age = "18";
    5. }
    6. var person = new Person();
    7. console.log(person);
    8. // prototype;
    9. // 性能不行
    10. // person.__proto__ = {}
    11. // 1.语义化,内部属性
    12. // 2.访问效率慢
    13. // 3.所有继承自该原型的对象都会影响到
    14. // Object.getPrototypeOf() 读取原型
    15. // Object.setPrototypeOf() 写原型
    16. // Object.creat(原型,属性集合描述符) 创建原型
    17. // 1.Object.setPrototypeOf()
    18. let proto = {y: 20, z: 40};
    19. let obj = {x: 10};
    20. let obj1 = Object.setPrototypeOf(obj,proto);
    21. console.log(obj1 === obj);
    22. // demo1
    23. // 给原始类型设置原型 貌似不可以
    24. let obj1 = Object.setPrototypeOf(1,{a: 10,b:10});// 没用
    25. let obj2 = Object.setPrototypeOf("foo",{a: 10, b:10}); //没有用
    26. let obj3 = Object.setPrototypeOf(true,{a: 10, b: 10}); // 没有用
    27. let obj4 = Object.setPrototypeOf(null,{a: 10, b: 10}); // 报错
    28. let obj5 = Object.setPrototypeOf(Symbol('d'),{a: 10});// 没有用
    29. cosnole.log(Object.getPrototypeOf(Number(1)) === Number.prototype);// true
    30. setPrototypeOf 第一个参数不是对象 默认用包装类来包装
    31. const foo = {
    32. a: 1,
    33. b: 2,
    34. c: 3
    35. }
    36. Object.defineProperties(foo,{
    37. d:{
    38. value:4
    39. },
    40. e:{
    41. value:5,
    42. enumerable:true
    43. }
    44. })
    45. // console.log(Object.keys(foo)) // [a, b, c, e]
    46. // cosnole.log(Object.values(foo))// [1, 2, 3, 5]
    47. let obj = {f: 6};
    48. // Object.setPrototypeOf(foo,obj);
    49. // Object.keys,Object.values 遍历出自身属性的值 并不能遍历出原型上的属性
    50. // Object.enties() 满足自身可枚举的属性和属性值的数组
    51. // let obj = "123"; Object.keys(obj); [0, 1, 2];
    52. // let obj = 1; Object.keys(obj);[]
    53. // let obj = true;Object.keys(obj);[]
    54. // let obj = undefined;Object.keys(obj);报错
    55. // let obj = Symbol('d');Object.keys(obj);[]
    56. // super关键字(指向对象的原型对象)==>this
    57. // 对象简写的方法才能生效
    58. // {
    59. // foo(){
    60. // super.x
    61. // }
    62. // }
    63. let proto = {
    64. y: 20,
    65. z: 30,
    66. foo:function (){
    67. console.log(this.y);
    68. }
    69. }
    70. let obj = {
    71. x: 10,
    72. // foo: function(){
    73. // console.log(super.y);
    74. // } // super key words unexpected here
    75. // foo:()=>{
    76. // console.log(super.y)
    77. // } // super key words unexpected here
    78. foo(){
    79. console.log(super.y);
    80. }
    81. }
    82. Object.setPrototypeOf(obj,proto);
    83. // Symbol ES6 新引入
    84. // 原始值类型的值 number string number undefined null symbol
    85. // Object Array Function
    86. let s1 = Symbol();
    87. s1.a = 1;// 挂不上属性
    88. console.log(s1.a);
    89. var obj = {a: 1};
    90. let s1 = Symbol(obj); // Object.prototype.toString();
    91. let s2 = Symbol(undefined); //Symbol()
    92. let s3 = Symbol(null); // Symbol(null)
    93. let s4 = Symbol(1); // Symbol(1);
    94. let s5 = Symbol(true) // Symbol(true);
    95. console.log(s1 + 1);// 不能通过number 类型转换
    96. console.log(String(s1)) //Symbol([object Object])
    97. console.log(Boolean(s1)) // true
    98. console.log(Object.getPrototypeOf(s1));// Symbol
    99. console.log(s1.toString());// "Symbol([object Object])"
    100. console.log(s1.valueOf());// Symbol