// super 4种遍历方式 原型 symbol 遍历.jsfunction Person (){ this.name = "zhangsan"; this.age = "18";}var person = new Person();console.log(person);// prototype;// 性能不行// person.__proto__ = {}// 1.语义化,内部属性// 2.访问效率慢// 3.所有继承自该原型的对象都会影响到// Object.getPrototypeOf() 读取原型// Object.setPrototypeOf() 写原型// Object.creat(原型,属性集合描述符) 创建原型// 1.Object.setPrototypeOf()let proto = {y: 20, z: 40};let obj = {x: 10};let obj1 = Object.setPrototypeOf(obj,proto);console.log(obj1 === obj);// demo1 // 给原始类型设置原型 貌似不可以let obj1 = Object.setPrototypeOf(1,{a: 10,b:10});// 没用let obj2 = Object.setPrototypeOf("foo",{a: 10, b:10}); //没有用let obj3 = Object.setPrototypeOf(true,{a: 10, b: 10}); // 没有用let obj4 = Object.setPrototypeOf(null,{a: 10, b: 10}); // 报错let obj5 = Object.setPrototypeOf(Symbol('d'),{a: 10});// 没有用cosnole.log(Object.getPrototypeOf(Number(1)) === Number.prototype);// truesetPrototypeOf 第一个参数不是对象 默认用包装类来包装const foo = { a: 1, b: 2, c: 3}Object.defineProperties(foo,{ d:{ value:4 }, e:{ value:5, enumerable:true }})// console.log(Object.keys(foo)) // [a, b, c, e]// cosnole.log(Object.values(foo))// [1, 2, 3, 5]let obj = {f: 6};// Object.setPrototypeOf(foo,obj); // Object.keys,Object.values 遍历出自身属性的值 并不能遍历出原型上的属性// Object.enties() 满足自身可枚举的属性和属性值的数组// let obj = "123"; Object.keys(obj); [0, 1, 2];// let obj = 1; Object.keys(obj);[]// let obj = true;Object.keys(obj);[]// let obj = undefined;Object.keys(obj);报错// let obj = Symbol('d');Object.keys(obj);[]// super关键字(指向对象的原型对象)==>this// 对象简写的方法才能生效// {// foo(){// super.x// }// }let proto = { y: 20, z: 30, foo:function (){ console.log(this.y); }}let obj = { x: 10, // foo: function(){ // console.log(super.y); // } // super key words unexpected here // foo:()=>{ // console.log(super.y) // } // super key words unexpected here foo(){ console.log(super.y); }}Object.setPrototypeOf(obj,proto); // Symbol ES6 新引入// 原始值类型的值 number string number undefined null symbol// Object Array Functionlet s1 = Symbol();s1.a = 1;// 挂不上属性console.log(s1.a);var obj = {a: 1};let s1 = Symbol(obj); // Object.prototype.toString();let s2 = Symbol(undefined); //Symbol()let s3 = Symbol(null); // Symbol(null)let s4 = Symbol(1); // Symbol(1);let s5 = Symbol(true) // Symbol(true);console.log(s1 + 1);// 不能通过number 类型转换console.log(String(s1)) //Symbol([object Object])console.log(Boolean(s1)) // trueconsole.log(Object.getPrototypeOf(s1));// Symbolconsole.log(s1.toString());// "Symbol([object Object])"console.log(s1.valueOf());// Symbol