// super 4种遍历方式 原型 symbol 遍历.js
function 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);// true
setPrototypeOf 第一个参数不是对象 默认用包装类来包装
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 Function
let 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)) // true
console.log(Object.getPrototypeOf(s1));// Symbol
console.log(s1.toString());// "Symbol([object Object])"
console.log(s1.valueOf());// Symbol