知名网站建设定制ES6--》对象扩展方法

目录


对象扩展

知名网站建设定制本文简单介绍以下ES6知名网站建设定制对对象新增的方法:

name 属性

函数的name属性,知名网站建设定制返回函数名。知名网站建设定制对象方法也是函数也有name属性。

  1. <script>
  2. const obj = {
  3. name:'张三',
  4. age:18,
  5. sayName(){
  6. console.log('hello world');
  7. }
  8. }
  9. console.log(obj.sayName.name);//sayName
  10. </script>

知名网站建设定制如果对象方法使用取值函数(getter)知名网站建设定制和存值函数(setter),需要该方法的属性的描述对象在对象get和set属性上面,返回值是方法名前加上get和set。

  1. <script>
  2. const obj = {
  3. get foo(){},
  4. set foo(x){}
  5. }
  6. const descriptor = Object.getOwnPropertyDescriptor(obj, 'foo');
  7. console.log(descriptor.get.name);//get foo
  8. </script>

有两种特殊情况:

  1. <script>
  2. // Function构造函数创造的函数,name属性返回anonymous。
  3. console.log((new Function()).name);//anonymous
  4. // bind方法创造的函数,name属性返回bound加上原函数的名字。
  5. var doSomething = function(){}
  6. console.log(doSomething.bind().name);//bound doSomething
  7. </script>

属性的遍历

ES6中一共有 5 种方法可以遍历对象的属性。

(1) for...in

循环遍历对象自身属性和继承的可枚举属性

(2)Object.keys(obj)

返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)的键名

(3)Object.getOwnPropertyNames(obj)

返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性)的键名

(4)Object.getOwnPropertySymbols(obj)

返回一个数组,包含对象自身的所有Symbol属性的键名

(5)Reflect.ownKeys(obj)

返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是Symbol或字符串,也不管是否可枚举。

和总是指向函数所在的当前对象一样,ES6新增了另一个类似的关键字super,指向当前对象的原型对象。

下面代码中,super.say() 指向原型对象 obj 的say方法,但是绑定的this却还是当前对象obj,因此输出的结果不是hello而是world。

  1. <script>
  2. const person = {
  3. x:'hello',
  4. say(){
  5. console.log(this.x);
  6. }
  7. }
  8. const obj = {
  9. x:'world',
  10. say(){
  11. super.say()
  12. }
  13. }
  14. Object.setPrototypeOf(obj,person)//,该对象将指定对象的原型(即内部[[Prototype]]属性)设置为另一个对象或为null。
  15. console.log(obj.say());//world
  16. </script>

Object.is()

用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。

  1. <script>
  2. var obj = {
  3. name:'张三',
  4. name1:'张三',
  5. gender:'男',
  6. age:18,
  7. say(){
  8. console.log('hello world');
  9. }
  10. }
  11. console.log(Object.is(obj.name,obj.name1));//true
  12. console.log(Object.is(1,1));//true
  13. // Object.is() 和 === 的区别在于以下特殊例子
  14. console.log(+0 === -0);//true
  15. console.log(Object.is(+0,-0));//false
  16. console.log(NaN === NaN);//false
  17. console.log(Object.is(NaN,NaN));//true
  18. </script>

Object.assign()

用于对象的合并,将源对象所有可枚举的属性,复制到目标对象上。

  1. <script>
  2. var obj = {
  3. a:1,
  4. b:2,
  5. c:'我是c'
  6. }
  7. var obj1 = {
  8. a:2, //当目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
  9. d:3,
  10. e:'我是e'
  11. }
  12. // console.log(Object.assign(target, source1, source2));
  13. console.log(Object.assign(obj,obj1));
  14. </script>

用到对象合并我们可以就会遇到一些问题了,请看如下例子:

  1. <script>
  2. // 参数不是对象,则会先转换成对象
  3. console.log(typeof Object.assign(2)); //object
  4. // null和undefined无法转对象,作为目标对象为false,但是作为源对象为true的
  5. // console.log(Object.assign(null,2));//报错提醒 Cannot convert undefined or null to object
  6. // console.log(Object.assign(2,null));//没报错
  7. // 其他类型像数值、字符串、布尔值虽然不会报错,但只有字符串会以数组形式拷入目标对象,其他值不会产生效果
  8. const x = 'abc'
  9. const y = 123
  10. const z = true
  11. console.log(Object.assign({},x));//{0: 'a', 1: 'b', 2: 'c'}
  12. console.log(Object.assign({},y));//{}
  13. console.log(Object.assign({},z));//{}
  14. </script>

在使用这个ES6新增的方法时,应该注意以下内容:

  1. <script>
  2. // Object.assign()实行的是浅拷贝,如果源对象发生任何变化,都会反映到目标对象上
  3. const obj1 = {a:1,b:2,c:{d:3}}
  4. const obj2 = Object.assign({},obj1)
  5. obj1.c.d = 3.14
  6. console.log(obj2.c.d);
  7. // Object.assign()可以用来处理数组
  8. console.log(Object.assign([1,2,3],[4,5]));// [4, 5, 3]
  9. // Object.assign()可以用来对取值函数进行处理,求值之后再处理
  10. const a = {
  11. get foo(){
  12. return 1
  13. }
  14. }
  15. console.log(Object.assign({},a));//{foo: 1}
  16. </script>

Object.getOwnPropertyDescriptors()

返回指定对象所有自身属性(非继承属性)的描述对象。

  1. <script>
  2. const obj = {
  3. num:12,
  4. get say(){
  5. return 'hello world'
  6. }
  7. }
  8. console.log(Object.getOwnPropertyDescriptors(obj));
  9. </script>

Object.setPrototypeOf()

方法作用与__proto__相同,用来设置应该对象的原型对象(prototype),返回参数对象本身。

  1. <script>
  2. let proto = {}
  3. let obj = {x:10}
  4. Object.setPrototypeOf(obj,proto)
  5. proto.y = 11
  6. proto.z = 12
  7. console.log(obj.x);//10
  8. console.log(obj.y);//11
  9. console.log(obj.z);//12
  10. </script>

Object.getPrototypeOf()

方法用于读取一个对象的原型对象,与Object.setPrototypeOf()方法配套。

  1. <script>
  2. function foo(){}
  3. const f = new foo()
  4. console.log(Object.getPrototypeOf(f) === foo.prototype);//true
  5. Object.setPrototypeOf(f,Object.prototype)//修改原型对象
  6. console.log(Object.getPrototypeOf(f) === foo.prototype);//false
  7. </script>

Object.keys()、Object.values、Object.entries()、Object.fromEntries()

三种方法都是返回一个数组,之间的区别请看如下:

  1. <script>
  2. // Object.keys() 返回所有可遍历的键名
  3. var obj = {aa:1,bb:'我是b',cc:2}
  4. console.log(Object.keys(obj));//['aa', 'bb', 'cc']
  5. // Object.values() 返回所有可遍历的属性的键值,键值排序按属性名数值大小排序i
  6. const obj1 = {12:'a',1:'b',18:'c'}
  7. console.log(Object.values(obj1));//['b', 'a', 'c']
  8. // Object.entries() 返回所有可遍历属性的键值对数组
  9. const obj2 = {1:'a','b':2,3:'c'}
  10. console.log(Object.entries(obj2));//[['1', 'a'],['3', 'c'],['b', 2]]
  11. // Object.fromEntries() 与 Object.entries()操作相反,将一键值对数组转为对象。
  12. console.log(Object.fromEntries([
  13. ['1', 'a'],
  14. ['3', 'c'],
  15. ['b', 2]
  16. ]));//{1: 'a', 3: 'c', b: 2}
  17. </script>

Object.hasOwn()

方法可以判断某个属性是否为原生属性,接受两个参数,第一个是参数是要判断的对象,第二个是属性名。

  1. <script>
  2. const obj = Object.create({a:12});
  3. obj.b = 34
  4. // 对象obj的属性a是继承属性,属性b是原生属性。
  5. console.log(Object.hasOwn(obj,'a'));//false
  6. console.log(Object.hasOwn(obj,'b'));//true
  7. </script>
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发