ECMAScript6(8):对象的扩展

  • 可以像定义存取器那样定义方法

var o = {

_age: 10,

_score: 60,

age(num){

if(num > 0) {

this._age = num;

return this;

}

return this._age;

},

get score(){

return this._score;

}

};

console.log(o.age()); //10

o.age(15);

console.log(o.age()); //15

console.log(o.score); //60

o.score = 100; //TypeError

注意,以下代码是等同的:

var obj = {

class () {} //并不会因为 class 是关键字而解析错误

};

//等价于

var obj = {

‘class’: function() {}

};

如果一个方法是 Generator 函数,需要在前面加 *:

var obj = {

time: 1,

*gen(){

yield "hello " + time;

time++;

}

}

  • 属性名表达式

js 本来可以这样 obj['k'+'ey'] 访问一个对象属性,现在也可以这样定义属性了:

var key1 = “name”;

var key2 = “age”;

var o = {

};

o.name; //“Bob”

o.age; //18

o.firstname; //“Ellen”

注意:该方法不能和上一小节使用已有标识符定义对象字面量的方法混合使用,否则会报错;

//错误用法

var foo = ‘bar’;

var bar = ‘abc’;

var baz = {[foo]}; //报错

  • 方法的 name 属性

函数有 name 属性,方法也就有 name 属性。一般方法 name 返回函数名(不包括对象名),对于存取器方法,没有 name 属性:

var o = {

_age: 10,

_score: 60,

_name: “Bob”,

_firstname: “Ellen”,

set age(num){

if(num > 0) {

this._age = num;

return this;

}

},

get age(){

return this._age;

},

get score(){

return this._score;

},

name(n){

if(!n) return this._name + ’ ’ + this._firstname;

this._name = n;

return this;

},

set firstname(n){

if(n) this._firstname = n;

return this;

}

};

console.log(o.name.name); //“name”

console.log(o.age.name); //undefined

console.log(o.score.name); //undefined

console.log(o.firstname); //undefined,所以 set 函数更不会有 name 属性

如果对象的方法是个 symbol,name 属性为空字符串 ""

var sym1 = new Symbol(“description of sym1”);

var sym2 = new Symbol();

var o = {

sym1{},

sym2{},

};

o[sym1].name; //“”

o[sym2].name; //“”

  • 静态方法
  1. Object.is(a,b): 比较a,b两个值是否严格相等,相当于 ===, 但有一点不一样:

-0 === +0; //true

NaN === NaN; //false

Object.is(-0, +0); //false

Object.is(NaN, NaN); //true

  1. Object.assign(target, source1,source2,…): 将每个 source 对象自身的可枚举属性复制到 target 对象上,不包括原型链上的属性和不可枚举属性。只有有一个参数不是对象,就会抛出 TypeError 错误。遇到同名属性,排在后面的会覆盖前面的:

var target = {a:1,b:2};

var source1 = {a:3,c:3};

var source2 = {a:2,d:0};

Object.assign(target, source1, source2);

console.log(target); //{a: 2, b: 2, c: 3, d: 0}

对于属性名是 symbol 的可枚举属性也会被复制:

Object.assign({a:‘b’}, {[Symbol(‘c’)]:‘d’}); //{a: “b”, Symbol©: “d”}

对于同名属性存在嵌套对象,外层会被直接替换:

Object.assign({a:{b:‘c’,d:‘e’}}, {a:{b:‘hello’}}); //{a:{b:‘hello’}}

可以用 Object.assign处理数组,但会视其为对象:

Object.assign([1,2,3], [4,5]); //[4, 5, 3]

技巧:为对象添加属性方法

Object.assign(String.prototype, {

newProperty: “value”,

newFunction: function(){}

})

技巧:克隆对象

Object.assign({},origin);

技巧:为对象添加属性方法

Object.assign(target, …source);

技巧:为对象添加属性方法

const DEFAULT_OPTION = { //默认值

a: 1,

b: 2

};

function processContent(newOption){

return Object.assign({}, DEFAULT_OPTION, newOption);

}

//设置属性应该是基本类型,否则会因为深拷贝出问题

对象属性的可枚举性与遍历

以下6个操作会忽略不可枚举的属性

  • for…in循环

  • Object.keys()

  • JSON.stringify()

  • Object.assign()

  • Reflect.enumerate()

  • 扩展运算符 ...

以下4个方法不忽略不可枚举属性

  • Object.getOwnPropertyNames()

  • Object.getOwnPropertySymbols()

  • Reflect.ownKeys()

以上9个方法中,只有2个会操作包含继承到的属性

  • for…in循环

  • Reflect.enumerate()

以上9个方法中,只有1个方法可以获得 Symbol 属性

  • Object.getOwnPropertySymbols()

除此之外需要强调的是 ES6 中,所有 class 的原型方法都是不可枚举的:

Object.getOwnPropertyDescriptor(class{foo(){}}.prototype, foo).enumerable; //false

ES6 起,有了7中遍历属性的方法:

  • for…in: 循环遍历对象自身和继承到的可枚举属性,不包括 Symbol 属性

  • Object.keys(obj): 返回包含自身可枚举属性的属性名数组,不包含 Symbol 属性

  • Object.getOwnPropertyNames(obj): 同上,但包括不可枚举属性

  • Object.getOwnPropertySymbols(obj): 返回自身所有 Symbol 属性名的数组,包括不可枚举属性

  • Reflect.ownKey(obj): 返回自身所有属性名数组,包括不可枚举属性和 Symbol 属性名

  • Reflect.enumerate(): 返回一个 Iterator, 用来遍历对象自身及继承到的可枚举属性,不包括 Symbol 属性;和 for…in 一样

  • for…of: 只能遍历具有 Iterator 接口的对象,具体作用范围由 iterator 决定,遍历没有 iterator 的对象会报错

以上方法除了 for…of 以外,遍历顺序为:

  • 首先遍历所有属性名为数字的属性,按数字大小排序;

  • 其次遍历所有属性名为字符串的属性,按属性生成时间排序;

  • 最后遍历所有属性名为 Symbol 的属性,按属性生成时间排序;

对象的proto属性

这是个很老很老的属性,在大家想期待下,ES6终于把它写进去了,嗯?…是写进附录了。这个属性用来读写当前的对象的原型对象obj.constructor.prototype

从本质上来讲,__proto__ 是定义在Object.prototype 上的一个存取器函数:

function isObject(a){

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!

前端视频资料:
的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

[外链图片转存中…(img-ShNz1y0Y-1713482937075)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-MdTQhM9n-1713482937075)]

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车免费领取!

[外链图片转存中…(img-xNx9Jcn6-1713482937075)]

前端视频资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值