File tree 4 files changed +45
-4
lines changed
4 files changed +45
-4
lines changed Original file line number Diff line number Diff line change @@ -753,7 +753,23 @@ colors.length = 0;
753
753
colors[0] // "red"
754
754
```
755
755
756
- 之所以会发生这种情况,是因为子类无法获得原生构造函数的内部属性,通过`Array.apply()`或者分配给原型对象都不行。ES5是先新建子类的实例对象`this`,再将父类的属性添加到子类上,由于父类的内部属性无法获取,导致无法继承原生的构造函数。比如,Array构造函数有一个内部属性`[[DefineOwnProperty]]`,用来定义新属性时,更新`length`属性,这个内部属性无法在子类获取,导致子类的`length`属性行为不正常。
756
+ 之所以会发生这种情况,是因为子类无法获得原生构造函数的内部属性,通过`Array.apply()`或者分配给原型对象都不行。原生构造函数会忽略`apply`方法传入的`this`,也就是说,原生构造函数的`this`无法绑定,导致拿不到内部属性。
757
+
758
+ ES5是先新建子类的实例对象`this`,再将父类的属性添加到子类上,由于父类的内部属性无法获取,导致无法继承原生的构造函数。比如,Array构造函数有一个内部属性`[[DefineOwnProperty]]`,用来定义新属性时,更新`length`属性,这个内部属性无法在子类获取,导致子类的`length`属性行为不正常。
759
+
760
+ 下面的例子中,我们想让一个普通对象继承`Error`对象。
761
+
762
+ ```javascript
763
+ var e = {};
764
+
765
+ Object .getOwnPropertyNames (Error .call (e))
766
+ // [ 'stack' ]
767
+
768
+ Object .getOwnPropertyNames (e)
769
+ // []
770
+ ` ` `
771
+
772
+ 上面代码中,我们想通过` Error .call (e)` 这种写法,让普通对象` e` 具有` Error ` 对象的实例属性。但是,` Error .call ()` 完全忽略传入的第一个参数,而是返回一个新对象,` e` 本身没有任何变化。这证明了` Error .call (e)` 这种写法,无法继承原生构造函数。
757
773
758
774
ES6允许继承原生构造函数定义子类,因为ES6是先新建父类的实例对象` this ` ,然后再用子类的构造函数修饰` this ` ,使得父类的所有行为都可以继承。下面是一个继承` Array ` 的例子。
759
775
Original file line number Diff line number Diff line change @@ -142,7 +142,7 @@ function bar(x = 2, y = x) {
142
142
bar (); // [2, 2]
143
143
```
144
144
145
- ES6规定暂时性死区和修订变量提升 ,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。
145
+ ES6规定暂时性死区和 ` let ` 、 ` const ` 语句不出现变量提升 ,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。
146
146
147
147
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
148
148
@@ -359,7 +359,7 @@ function f() { console.log('I am outside!'); }
359
359
360
360
注意,上面三条规则只对ES6的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作` let ` 处理。
361
361
362
- 前面那段代码,在老版本的Chrome环境下运行会报错 。
362
+ 前面那段代码,在Chrome环境下运行会报错 。
363
363
364
364
``` javascript
365
365
// ES6的浏览器环境
Original file line number Diff line number Diff line change @@ -774,7 +774,16 @@ function SaferHTML(templateData) {
774
774
}
775
775
```
776
776
777
- 上面代码中,经过` SaferHTML ` 函数处理,HTML字符串的特殊字符都会被转义。
777
+ 上面代码中,` sender ` 变量往往是用户提供的,经过` SaferHTML ` 函数处理,里面的特殊字符都会被转义。
778
+
779
+ ``` javascript
780
+ var sender = ' <script>alert("abc")</script>' ; // 恶意代码
781
+ var message = SaferHTML ` <p >${ sender} has sent you a message.</p >` ;
782
+
783
+ message
784
+ // <p><script>alert("abc")</script> has sent you a message.</p>
785
+ ```
786
+
778
787
779
788
标签模板的另一个应用,就是多语言转换(国际化处理)。
780
789
Original file line number Diff line number Diff line change @@ -453,6 +453,22 @@ class MyClass {
453
453
[1 , 2 , 3 ] instanceof new MyClass () // true
454
454
```
455
455
456
+ 上面代码中,` MyClass ` 是一个类,` new MyClass() ` 会返回一个实例。该实例的` Symbol.hasInstance ` 方法,会在进行` instanceof ` 运算时自动调用,判断左侧的运算子是否为` Array ` 的实例。
457
+
458
+ 下面是另一个例子。
459
+
460
+ ``` javascript
461
+ class Even {
462
+ static [Symbol .hasInstance ](obj ) {
463
+ return Number (obj) % 2 === 0 ;
464
+ }
465
+ }
466
+
467
+ 1 instanceof Even // false
468
+ 2 instanceof Even // true
469
+ 12345 instanceof Even // false
470
+ ```
471
+
456
472
### Symbol.isConcatSpreadable
457
473
458
474
对象的` Symbol.isConcatSpreadable ` 属性等于一个布尔值,表示该对象使用` Array.prototype.concat() ` 时,是否可以展开。
You can’t perform that action at this time.
0 commit comments