@@ -663,25 +663,25 @@ ES6 一共有5种方法可以遍历对象的属性。
663663
664664** (2)Object.keys(obj)**
665665
666- ` Object.keys ` 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)。
666+ ` Object.keys ` 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名 。
667667
668668** (3)Object.getOwnPropertyNames(obj)**
669669
670- ` Object.getOwnPropertyNames ` 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)。
670+ ` Object.getOwnPropertyNames ` 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名 。
671671
672672** (4)Object.getOwnPropertySymbols(obj)**
673673
674- ` Object.getOwnPropertySymbols ` 返回一个数组,包含对象自身的所有 Symbol 属性 。
674+ ` Object.getOwnPropertySymbols ` 返回一个数组,包含对象自身的所有 Symbol 属性的键名 。
675675
676676** (5)Reflect.ownKeys(obj)**
677677
678- ` Reflect.ownKeys ` 返回一个数组,包含对象自身的所有属性,不管属性名是 Symbol 或字符串,也不管是否可枚举。
678+ ` Reflect.ownKeys ` 返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
679679
680- 以上的5种方法遍历对象的属性 ,都遵守同样的属性遍历的次序规则。
680+ 以上的5种方法遍历对象的键名 ,都遵守同样的属性遍历的次序规则。
681681
682- - 首先遍历所有属性名为数值的属性,按照数字排序 。
683- - 其次遍历所有属性名为字符串的属性,按照生成时间排序 。
684- - 最后遍历所有属性名为 Symbol 值的属性,按照生成时间排序 。
682+ - 首先遍历所有数值键,按照数值升序排列 。
683+ - 其次遍历所有字符串键,按照加入时间升序排列 。
684+ - 最后遍历所有 Symbol 键,按照加入时间升序排列 。
685685
686686``` javascript
687687Reflect .ownKeys ({ [Symbol ()]: 0 , b: 0 , 10 : 0 , 2 : 0 , a: 0 })
@@ -850,22 +850,24 @@ d.a // "a"
850850
851851上面代码返回一个新的对象` d ` ,代表了对象` a ` 和` b ` 被混入了对象` c ` 的操作。
852852
853- 出于完整性的考虑,` Object.getOwnPropertyDescriptors ` 进入标准以后,还会有 ` Reflect.getOwnPropertyDescriptors ` 方法。
853+ 出于完整性的考虑,` Object.getOwnPropertyDescriptors ` 进入标准以后,以后还会新增 ` Reflect.getOwnPropertyDescriptors ` 方法。
854854
855855## ` __proto__ ` 属性,Object.setPrototypeOf(),Object.getPrototypeOf()
856856
857+ JavaScript 语言的对象继承是通过原型链实现的。ES6 提供了更多原型对象的操作方法。
858+
857859### ` __proto__ ` 属性
858860
859861` __proto__ ` 属性(前后各两个下划线),用来读取或设置当前对象的` prototype ` 对象。目前,所有浏览器(包括 IE11)都部署了这个属性。
860862
861863``` javascript
862- // es6的写法
864+ // es6 的写法
863865const obj = {
864866 method : function () { ... }
865867};
866868obj .__proto__ = someOtherObj;
867869
868- // es5的写法
870+ // es5 的写法
869871var obj = Object .create (someOtherObj);
870872obj .method = function () { ... };
871873```
@@ -896,12 +898,13 @@ Object.defineProperty(Object.prototype, '__proto__', {
896898 }
897899 },
898900});
901+
899902function isObject (value ) {
900903 return Object (value) === value;
901904}
902905```
903906
904- 如果一个对象本身部署了` __proto__ ` 属性,则该属性的值就是对象的原型 。
907+ 如果一个对象本身部署了` __proto__ ` 属性,该属性的值就是对象的原型 。
905908
906909``` javascript
907910Object .getPrototypeOf ({ __proto__: null })
@@ -1019,6 +1022,74 @@ Object.getPrototypeOf(undefined)
10191022// TypeError: Cannot convert undefined or null to object
10201023```
10211024
1025+ ## super 关键字
1026+
1027+ 我们知道,` this ` 关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字` super ` ,指向当前对象的原型对象。
1028+
1029+ ``` javascript
1030+ const proto = {
1031+ foo: ' hello'
1032+ };
1033+
1034+ const obj = {
1035+ find () {
1036+ return super .foo ;
1037+ }
1038+ };
1039+
1040+ Object .setPrototypeOf (obj, proto);
1041+ obj .find () // "hello"
1042+ ```
1043+
1044+ 上面代码中,对象` obj ` 的` find ` 方法之中,通过` super.foo ` 引用了原型对象` proto ` 的` foo ` 属性。
1045+
1046+ 注意,` super ` 关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。
1047+
1048+ ``` javascript
1049+ // 报错
1050+ const obj = {
1051+ foo: super .foo
1052+ }
1053+
1054+ // 报错
1055+ const obj = {
1056+ foo : () => super .foo
1057+ }
1058+
1059+ // 报错
1060+ const obj = {
1061+ foo : function () {
1062+ return super .foo
1063+ }
1064+ }
1065+ ```
1066+
1067+ 上面三种` super ` 的用法都会报错,因为对于 JavaScript 引擎来说,这里的` super ` 都没有用在对象的方法之中。第一种写法是` super ` 用在属性里面,第二种和第三种写法是` super ` 用在一个函数里面,然后赋值给` foo ` 属性。目前,只有对象方法的简写法可以让 JavaScript 引擎确认,定义的是对象的方法。
1068+
1069+ JavaScript 引擎内部,` super.foo ` 等同于` Object.getPrototypeOf(this).foo ` (属性)或` Object.getPrototypeOf(this).foo.call(this) ` (方法)。
1070+
1071+ ``` javascript
1072+ const proto = {
1073+ x: ' hello' ,
1074+ foo () {
1075+ console .log (this .x );
1076+ },
1077+ };
1078+
1079+ const obj = {
1080+ x: ' world' ,
1081+ foo () {
1082+ super .foo ();
1083+ }
1084+ }
1085+
1086+ Object .setPrototypeOf (obj, proto);
1087+
1088+ obj .foo () // "world"
1089+ ```
1090+
1091+ 上面代码中,` super.foo ` 指向原型对象` proto ` 的` foo ` 方法,但是绑定的` this ` 却还是当前对象` obj ` ,因此输出的就是` world ` 。
1092+
10221093## Object.keys(),Object.values(),Object.entries()
10231094
10241095### Object.keys()
0 commit comments