1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-25 03:02:21 +00:00

edit object

This commit is contained in:
ruanyf 2015-11-02 07:14:00 +08:00
parent 7c2ba1b038
commit e26516f3cd
3 changed files with 38 additions and 9 deletions

View File

@ -49,9 +49,10 @@ class Point{
}
typeof Point // "function"
Point === Point.prototype.constructor // true
```
上面代码表明,类的数据类型就是函数。
上面代码表明,类的数据类型就是函数,类本身就指向构造函数
构造函数的prototype属性在ES6的“类”上面继续存在。事实上类的所有方法都定义在类的prototype属性上面。
@ -282,7 +283,7 @@ const MyClass = class Me {
};
```
上面代码使用表达式定义了一个类。需要注意的是这个类的名字是MyClass而不是MeMe只在Class的内部代码可用指代当前类。
上面代码使用表达式定义了一个类。需要注意的是这个类的名字是MyClass而不是`Me``Me`只在Class的内部代码可用指代当前类。
```javascript
let inst = new MyClass();
@ -290,7 +291,7 @@ inst.getClassName() // Me
Me.name // ReferenceError: Me is not defined
```
上面代码表示Me只在Class内部有定义。
上面代码表示,`Me`只在Class内部有定义。
如果Class内部没用到的话可以省略Me也就是可以写成下面的形式。
@ -347,7 +348,7 @@ class Foo {}
### 基本用法
Class之间可以通过extends关键字实现继承这比ES5的通过修改原型链实现继承要清晰和方便很多。
Class之间可以通过`extends`关键字实现继承这比ES5的通过修改原型链实现继承要清晰和方便很多。
```javascript
class ColorPoint extends Point {}
@ -397,7 +398,7 @@ constructor(...args) {
}
```
另一个需要注意的地方是在子类的构造函数中只有调用super之后才可以使用this关键字否则会报错。这是因为子类实例的构建是基于对父类实例加工只有super方法才能返回父类实例。
另一个需要注意的地方是在子类的构造函数中只有调用super之后才可以使用`this`关键字否则会报错。这是因为子类实例的构建是基于对父类实例加工只有super方法才能返回父类实例。
```javascript
class Point {
@ -532,7 +533,7 @@ A.prototype.__proto__ === Object.prototype // true
这种情况下A作为一个基类即不存在任何继承就是一个普通函数所以直接继承`Funciton.prototype`。但是A调用后返回一个空对象即Object实例所以`A.prototype.__proto__`指向构造函数Object的prototype属性。
第三种特殊情况子类继承null。
第三种特殊情况,子类继承`null`
```javascript
class A extends null {
@ -767,7 +768,7 @@ inst.prop
// 'getter'
```
上面代码中prop属性有对应的存值函数和取值函数因此赋值和读取行为都被自定义了。
上面代码中,`prop`属性有对应的存值函数和取值函数,因此赋值和读取行为都被自定义了。
存值函数和取值函数是设置在属性的descriptor对象上的。
@ -898,7 +899,17 @@ Bar.classMethod();
静态属性指的是Class本身的属性`Class.propname`,而不是定义在实例对象(`this`)上的属性。
ES6明确规定类只有静态方法没有静态属性即像`Class.propname`这样的用法不存在。
```javascript
class Foo {
}
Foo.prop = 1;
Foo.prop // 1
```
上面的写法可以读写`Foo`类的静态属性`prop`
目前只有这种写法可行因为ES6明确规定Class内部只有静态方法没有静态属性。
```javascript
// 以下两种写法都无效,

View File

@ -97,7 +97,7 @@ export {
};
```
上面代码使用as关键字重命名了函数v1和v2的对外接口。重命名后v2可以用不同的名字输出两次。
上面代码使用`as`关键字,重命名了函数`v1``v2`的对外接口。重命名后,`v2`可以用不同的名字输出两次。
最后,`export`命令可以出现在模块的任何位置,只要处于模块顶层就可以。如果处于块级作用域内,就会报错,下面的`import`命令也是如此。
@ -157,6 +157,16 @@ export { Car }
上面的模块先加载`Vehicle`模块,然后在其基础上添加了`move`方法,再作为一个新模块输出。
注意,`import`命令具有提升效果,会提升到整个模块的头部,首先执行。
```javascript
foo();
import { foo } from 'my_module';
```
上面的代码不会报错,因为`import`的执行早于`foo`的调用。
如果在一个模块之中,先输入后输出同一个模块,`import`语句可以与`export`语句写在一起。
```javascript

View File

@ -394,6 +394,14 @@ a2[1] = 6;
对象的`Symbol.species`属性,指向一个方法。该对象作为构造函数创造实例时,会调用这个方法。即如果`this.constructor[Symbol.species]`存在,就会使用这个属性作为构造函数,来创造新的实例对象。
`Symbol.species`属性默认的读取器如下。
```javascript
static get [Symbol.species]() {
return this;
}
```
### Symbol.match
对象的`Symbol.match`属性,指向一个函数。当执行`str.match(myObject)`时,如果该属性存在,会调用它,返回该方法的返回值。