Skip to content

Commit a782099

Browse files
committed
docs(object): edit object/super
1 parent 55dc77e commit a782099

File tree

2 files changed

+84
-13
lines changed

2 files changed

+84
-13
lines changed

docs/function.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ fn()
620620
new fn()
621621
```
622622

623-
这种方法的问题是,如果通过`call()``apply()``bind()`这些方法绑定`this`就会判断失效
623+
这种方法的问题是,如果通过`call()``apply()``bind()`这些方法绑定`this`就会判断失败
624624

625625
```javascript
626626
// 不报错

docs/object.md

Lines changed: 83 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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
687687
Reflect.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 的写法
863865
const obj = {
864866
method: function() { ... }
865867
};
866868
obj.__proto__ = someOtherObj;
867869

868-
// es5的写法
870+
// es5 的写法
869871
var obj = Object.create(someOtherObj);
870872
obj.method = function() { ... };
871873
```
@@ -896,12 +898,13 @@ Object.defineProperty(Object.prototype, '__proto__', {
896898
}
897899
},
898900
});
901+
899902
function isObject(value) {
900903
return Object(value) === value;
901904
}
902905
```
903906

904-
如果一个对象本身部署了`__proto__`属性,则该属性的值就是对象的原型
907+
如果一个对象本身部署了`__proto__`属性,该属性的值就是对象的原型
905908

906909
```javascript
907910
Object.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

Comments
 (0)