一、es6原型相关方法
proto属性是浏览器内部属性,不是正式对外的api,es6中并没有收入正文。
es6提供了原型的操作方法。
(1)Object.getPrototypeOf, 获取对象原型,参数如果不是对象,会进行转化。
function Super (){
this.name = 'SuperInstance'
}
let instance = new Super();
console.log(Object.getPrototypeOf(instance) === Super.prototype) // =>true
console.log(Object.getPrototypeOf(123)) // => Number.prototype
(2)更改对象原型 Object.setPrototypeOf,es6正式推荐原型设置方法
接收两个参数,返回第一个参数
a.目标对象
b.设置的原型
如果第一个参数为非对象,会转化为对象,但是返回的是第一个参数,这个操作不产生任何影响。
如果第一个参数为null或undefined,会报错。
二、遍历方法
(1)Objec.keys
es5提供了Object.keys,用来获取对象所有自身可遍历属性箭名数组。会过滤Symbol属性名
null和undefined会报错,其余对象非会转化成对象,只有字符串包装类有可遍历属性。
let str = '123123'
console.log(Object.keys(str)) // => ["0", "1", "2", "3", "4", "5"]
(2)Object.values
es7引入了Object.values和Object.entries作为遍历补充,还可和for … of配套使用。
Object.values用来获取对象所有自身可遍历属性值数组
Objec.values会过滤属性名为Symbol值的属性值
参数为null和undefined会报错,只有字符串包装类型实例才有自身属性,其余包装类型返回结果为空数组。
数字对象,默认原始值为0
布尔对象,默认原始值为false
字符串对象
console.log(Object.values('123')) // => ['1', '2', '3']
(3)Object.entries
返回一个包含二维数组,每个元素是对象可遍历属性键值数组, Symbol值属性依然会被忽略
let o = {
a: '1',
b: '2',
c: '3'
}
let entries = Object.entries(o);
for(let [key, value] of entries ){ // 结构赋值 let [key, value] = ['a' : '1'];
console.log(key, value) // 打印对象每个key与对应value
}
三、Symbol<br />(1)Symbol特点,引入原因<br />Symbol是一种**原始数据类型,不是对象**,所以无法添加属性。es5中,对象属性名都是字符串。为了避免属性名重复引入了Symbol。<br />**Symbol不是构造函数**,不能使用new运算符。<br />Symbol()接受一个**字符串参数**,**作为Symbol的描述**,用来控制台输出、转成字符串时进行区分。如果传入的是一个对象,则会调用起toString方法,再生成Symbol值。<br />获取Symbol描述,es6中需要将symbol值转化为字符串,es2019可以直接访问symbol.description<br />(2)注意点:<br />a.不管接收参数是否一样,产生的Symbol值都不相等(Symbol值的价值就是**独一无二**)
let symbol1 = Symbol('1'),
symbol2 = Symbol('2');
console.log(typeof symbolVal) // => 'symbol'
console.log(symbol1, symbol2) // => Symbol(1) , Symbol(2)
console.log(symbol1.toString(), symbol2.toString()) // => 'Symbol(1)' , 'Symbol(2)'
b.Symbol值不能参与计算,会报错,但是可以转化为字符串和布尔值(真值),不能转化为数字。
(3)Symbol值作为属性名
用标志符的方式不能将Symbol值作为属性名,可以用中括号、Object.defineProperty
let mySymbol = Symbol('mySymbol'),
o = {};
o.mySymbol = 123;
o[mySymbol] = 123;
Object.defineProperty(o,mySymbol,{
value : 678
})
(4)消除魔法字符串
魔法字符串指,代码中多次出现的字符串,于代码形成了’ 强耦合’,不利于维护。将字符串存于一个变量中,统一引用该变量,维护的时候只需修改某个变量,省事。
let shapeObj = {
triangle : 'triangle'
};
function computor(shape, options){
swicth(shape){
case shapeObj.triangle :
return options.width * option.length;
......
}
}
computor('triangle',{width:123, length: 678})
(5)遍历对象所有Symbol值属性名 Object.getOwnPropertySymbols。Object.assign可以复制对象可枚举Symbol值属性。
let symbol123 = {
[Symbol(123)] : 123
}
console.log(Object.getOwnPropertySymbols(symbol123))
(6)查找Symbol值,以及Symbol描述值<br />Symbol.for方法,用于查找并返回对应描述的Symbol值,如果没有对应Symbol值,以参数为描述创建一个**全局登记的Symbol值**(Symbol()没有登记机制)
function test(){
console.log(Symbol.for('123')) //没有查找到的话,就生成一个全局Symbol值
}
console.log(Symbol.for('123')) // Symbol(123)
Symbol.keyFor返回已登记的 Symbol 类型值的key(通过Symbol.for()创建的全局Symbol值)。
let s1 = Symbol.for('123'),
s2 = Symbol('123');
console.log(Symbol.keyFor(s1), Symbol.keyFor(s2)) // '123', undefined