课程
描述
定义类
类主体
类型:Getter、setter、方法或字段 位置:静态或实例 可见性:公共或私人
施工单位
类矩形{ 构造(高度、宽度){ this.height=高度; this.width=宽度; } }
静态初始化块
方法
类矩形{ 构造(高度、宽度){ this.height=高度; this.width=宽度; } //Getter公司 获取区域(){ return this.calcArea(); } //方法 计算区域(){ 返回this.height*this.width; } *获取侧面(){ 屈服高度; 产生这个宽度; 屈服高度; 屈服宽度; } } const square=新矩形(10,10); console.log(方形面积);// 100 console.log([…square.getSides()]);// [10, 10, 10, 10]
静态方法和字段
类点{ 构造函数(x,y){ 这个.x=x; this.y=y; } static displayName=“Point”; 静态距离(a,b){ 常数dx=a.x-b.x; 常数dy=a.y-b.y; return Math.hyp(dx,dy); } } const p1=新点(5,5); const p2=新点(10,10); p1.displayName;// 未定义 p1.距离;// 未定义 p2.displayName;// 未定义 p2.距离;// 未定义 console.log(Point.displayName);// “点” 控制台.log(点距离(p1,p2));// 7.0710678118654755
字段声明
类矩形{ 高度=0; 宽度; 构造(高度、宽度){ this.height=高度; this.width=宽度; } }
私人财产
类矩形{ #高度=0; #宽度; 构造(高度、宽度){ 这个# 高度=高度; 这个# 宽度=宽度; } }
继承
类动物{ 建造师(姓名){ this.name=名称; } 拼写(){ console.log(`${this.name}发出噪音。`); } } 类狗延伸动物{ 建造师(姓名){ super(名称);// 调用超类构造函数并传入name参数 } 演讲(){ console.log(`${this.name}barks.`); } } const d=新狗(“Mitzie”); d.speak();// 米齐吠叫着。
. The
类别Cat{ 建造师(姓名){ this.name=名称; } 演讲(){ console.log(`${this.name}发出噪音。`); } } 狮子延伸猫类{ 演讲(){ super.speak(); console.log(`${this.name}咆哮。`); } } const l=新狮子(“模糊”); l.speak(); //模糊会发出噪音。 //模糊咆哮。
评估顺序
这个 延伸 子句(如果存在)首先被求值。 它必须计算为有效的构造函数或 无效的 ,或a 类型错误 被抛出。 这个 建造师 方法,如果 建造师 不存在。 然而,因为 建造师 定义只是一个方法定义,这个步骤是不可观察的。 类元素的属性键按声明的顺序进行计算。 如果计算了属性键,则使用 这 值设置为 这 类周围的值(而不是类本身)。 尚未计算任何属性值。 方法和访问器是按照声明的顺序安装的。 实例方法和访问器安装在 原型 属性,并且静态方法和访问器安装在类本身上。 将保存私有实例方法和访问器,以便稍后直接安装到实例上。 此步骤不可见。 该类现在使用指定的原型进行初始化 延伸 和由指定的实现 建造师 。对于上述所有步骤,如果计算的表达式尝试访问类的名称 引用错误 引发,因为该类尚未初始化。 类元素的值按声明的顺序进行计算: 该类现在已完全初始化,可以用作构造函数。
示例
将其与实例和静态方法绑定
类动物{ 演讲(){ 返回此; } 静态eat(){ 返回此; } } const obj=新动画(); obj.speak();// 动物对象 const speak=obj.speak; speak();// 未定义 动物eat();// 类动物 const eat=动画吃; eat();// 未定义
函数Animal(){} Animal.prototype.speak=函数(){ 返回此; }; Animal.eat=函数(){ 返回此; }; const obj=新动画(); const speak=对象峰值; speak();// 全局对象(非严格模式) const eat=动物吃; eat();// 全局对象(非限制模式)