ES6时代还需要学习原型链吗?

JavaScript中原型链是一个非常重要的内容,值得我们深入的去学习和探讨

回答标题,ES6时代需要学习原型链,因为ES6中的class只是一个语法糖,因此要深入理解ES6class,就需要具备原型链的知识。

基于原型

1
2
3
class Point {
// ...
}

既然class只是一个语法糖,那么就有:

1
2
typeof Point // "function"
Point === Point.prototype.constructor // true

Point中定义的方法就是定义在类的原型prototype中的,它属于类方法 。在构造函数中通过this.XXX定义的才属于实例变量。当要扩展一个类的时候我们变可以使用Object.assign向类的原型prototype中添加方法:

1
2
3
4
5
6
7
8
9
10
class Point {
constructor(){
// ...
}
}

Object.assign(Point.prototype, {
toString(){},
toValue(){}
});

受对象属性描述符控制

和ES5一样,我们可以通过对象属性描述符来精细的控制对象的属性。

1
2
3
4
5
6
7
8
class Point{
constructor(){
this.name = "point";
}
}
Object.defineProperty(Point.prototype,'sayName',{value:function(){console.log(this.name)}});
var p = new Point();
p.sayName(); //"point"

使用Object.getOwnPropertyDescriptor来查看sayName当前的特性:

1
2
Object.getOwnPropertyDescriptor(Point.prototype, "sayName")
//{value: ƒ, writable: false, enumerable: false, configurable: false}

当对对象的某个属性的访问或者写入有所限制的时候,还可以使用访问器属性,这样就可以将原属性设置为私有属性,对外只暴露访问器属性即可。

1
2
3
4
5
class Person{
#age;
get age() { return #x }
set age(value) { if(value>200){alert("人的年龄不能超过200");return} this.#x=value }
}

由此可见,ES6的class也是基于原型的,但是ES6及更高的版本也为class添加很多的特性,详见阮老师的书。既然ES6的class是基于原型的,那它的继承又是怎么做的呢?

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 基于原型
  2. 2. 受对象属性描述符控制
,