Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承

s6新增了一种定义对象实例的方法,Class(类)这个概念,作为对象的模板。class可以看作只是一个语法糖,通过class关键字,可以定义类。让对象原型的写法更加清晰、更像面向对象编程的语法。

一.  Class的基本用法

1.  constructor方法

 1 //定义类
 2 class Point {
 3   constructor(x, y) {
 4     this.x = x;
 5     this.y = y;
 6   }
 7
 8   toString() {
 9     return ‘(‘ + this.x + ‘, ‘ + this.y + ‘)‘;
10   }

ES6的类,完全可以看作构造函数的另一个写法。类的数据类型就是函数,类本身就指向构造函数。使用时候,类必须使用new调用。

 1 class Point {
 2   // ...
 3 }
 4
 5 typeof Point // "function"
 6 Point === Point.prototype.constructor // true   prototype对象的constructor属性,直接指向“类”的本身,这与 ES5 的行为是一致的。
 7
 8 class Bar {
 9   doStuff() {
10     console.log(‘stuff‘);
11   }
12 }
13
14 var b = new Bar();
15 b.doStuff() // "stuff"

类的所有方法都定义在类的prototype属性上面。在类的实例上面调用方法,其实就是调用原型prototype对象上的方法,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。

 1 class Point {
 2   constructor() {
 3   }
 4
 5   toValue() {
 6   }
 7 }
 8
 9 // 等同于
10
11 Point.prototype = {
12   constructor() {},
13   toValue() {},
14 };
15
16
17 Object.assign(Point.prototype, {
18   toString(){},
19 })

2.class的静态属性和实例属性

2.1类的实例属性:类的实例属性可以用等式,写入类的定义之中。(Class 内部只有静态方法,没有静态属性)

1 class MyClass {
2   myProp = 42;
3
4   constructor() {
5     console.log(this.myProp); // 42
6   }

为了可读性的目的,对于那些在constructor里面已经定义的实例属性,新写法允许直接列出。

1 class ReactCounter extends React.Component {
2   state = {
3     count: 0
4   };

2.2  类的静态属性:类的静态属性只要在上面的实例属性写法前面,加上static关键字就可以了。

1 class MyClass {
2   static myStaticProp = 42;
3
4   constructor() {
5     console.log(MyClass.myStaticProp); // 42
6   }
7 }

3. class的静态方法:类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

 1 class Foo {
 2   static classMethod() {
 3     return ‘hello‘;
 4   }
 5 }
 6
 7 Foo.classMethod() // ‘hello‘
 8
 9 var foo = new Foo();
10 foo.classMethod()// TypeError: foo.classMethod is not a function
11
12
13 //如果静态方法包含this关键字,这个this指的是类,而不是实例。静态方法可以与非静态方法重名。
14 class Foo {
15   static bar () {
16     this.baz();
17   }
18   static baz () {
19     console.log(‘hello‘);
20   }
21   baz () {
22     console.log(‘world‘);
23   }
24 }
25
26 Foo.bar() // hello   静态方法bar调用了this.baz,这里的this指的是Foo类,而不是Foo的实例,等同于调用Foo.baz。

3.1实例方法

1 /* --- 实例方法 -- */
2 function ClassA() { //定义构造函数
3 };
4 ClassA.prototype.func = function() { //在构造函数的原型上添加方法
5   console.log("This is an instance method.");
6 }
7 var instance = new ClassA(); //新建一个实例
8 ClassA.func(); // Error:ClassA.func is not a function
9 instance.func(); //This is an instance method.

上面代码结果报错如下。。。

1 // 定义在某个具体对象(实例)上的方法是实例方法
2 function ClassA() { //定义构造函数
3 };
4 var instance = new ClassA(); //新建一个实例
5 instance.func = function() {
6     console.log("This is an instance method.")
7   }
8   // ClassA.func(); // Error:ClassA.func is not a function
9 instance.func(); //This is an instance method.

4 this和super关键字

4.1   `super`这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

第一种情况,`super`作为函数调用时,代表父类的构造函数。ES6 要求,子类的构造函数必须执行一次`super`函数。

4.2

面向对象语言中 this 表示当前对象的一个引用。

但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。

  • 在方法中,this 表示该方法所属的对象。
  • 如果单独使用,this 表示全局对象。
  • 在函数中,this 表示全局对象。
  • 在函数中,在严格模式下,this 是未定义的(undefined)。
  • 在事件中,this 表示接收事件的元素。
  • 类似 call() 和 apply() 方法可以将 this 引用到任何对象。

5 .类的继承

5.1 Class 可以通过`extends`关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多。

class Point {
}

class ColorPoint extends Point {
}

  

原文地址:https://www.cnblogs.com/jiazhaolong/p/12064114.html

时间: 2024-10-07 06:52:19

Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承的相关文章

对象方法、类方法、原型方法 && 私有属性、公有属性、公有静态属性

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>test</title> </head> <body> <script> //对象构造函数 function Atest(name){ //私有属性,只能在对象构造函数内部使用 var class

js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别

1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>test</title> 5 </head> 6 <body> 7 <script> 8 //对象构造函数 9 function Atest(name){ 10 //私有属性,只能

ES6---class的静态方法、静态属性和实例属性

前言: 类相当于实例的原型, 所有在类中定义的方法, 都会被实例继承. 主体: 如果在一个方法前, 加上static关键字, 就表示该方法不会被实例继承, 而是直接通过类来调用, 这就称为“ 静态方法”. 但是注意父类的静态方法,也会被子类继承 注意:当用实例调用时会报错 TypeError: dad.habit is not a function (2)静态方法也可以从super对象上调用 (3)静态属性 静态属性指的是 Class 本身的属性, 即Class.propname, 而不是定义在

JavaScript面向对象(二)——成员属性、静态属性、原型属性与JS原型链

前  言 上一篇博客(https://www.cnblogs.com/qdjianghao/p/10177360.html )中,我们介绍了JS中的面向对象,并详细的解释了this的指向问题.本篇博客,我们继续来学习JS的面向对象.来深入理解一下JavaScript OOP中的成员属性/方法.静态属性/方法.原型属性/方法,并且一起来探讨一下JS中的原型与原型链. 一 成员属性与成员方法 在构造函数中,通过this.属性声明.或者实例化出对象后,通过"对象.属性"追加的.都属于成员属性

ES6入门六:class的基本语法、继承、私有与静态属性、修饰器

基本语法 继承 私有属性与方法.静态属性与方法 修饰器(Decorator) 一.基本语法 1 class Grammar{ 2 constructor(name,age){ //定义对象自身的方法和属性 3 this.name = name, 4 this.age = age 5 } 6 // 在原型上定义只读属性 7 get inva(){ 8 return "JS"; 9 } 10 //在原型上定义可读写属性 11 set skill(val){ 12 this._skill =

类和对象:静态属性、静态方法

在PHP中,使用关键字 static 修饰成员属性和成员方法被称为静态属性和静态方法.静态属性和静态方法不需要在类被实例化的情况下可以直接使用. 静态属性 与普通的成员属性不同,静态属性属于类本身而不属于类的任何实例.静态属性可以被看做是存储在类当中的全局变量,可以在任何地方通过类来访问它们. 由于静态属性不受任何具体对象的限制,所以不需要建立类实例,而可以直接引用类中的静态属性,使用语法格式如下: 类名称::$静态属性名称 其中,符号”::”被称作范围解析操作符,它可以用于访问静态成员.静态方

java中静态属性和和静态方法的继承问题 以及多态的实质

首先结论是:java中静态属性和和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏. 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成的,不需继承机制就可以调用如果子类里面定义了静态方法和属性,那么这时候父类的静态方法 或属性称之为“隐藏”,你如果想要调用父类的静态方法和属性,直接通过父类名.方法名或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是 跟实例方法和属性不太一样,存在“隐藏”的这种情况. 多态之所以能够实现是依赖于 继承 接口和 重写 .重

static静态属性和静态方法的原理与调用技巧

这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态方法的调用.分享给大家供大家参考.具体如下: 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就

Swift的静态属性

面向对象类型       实例存储属性        静态存储属性        实例计算属性        静态计算属性 类                            支持                        不支持                支持                        支持 结构体                      支持                        支持                    支持          

面向对象的静态属性和静态方法

一,静态属性 静态属性时该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量 定义静态属性:访问修饰符 static 静态属性名 静态属性的访问: 1.在类的内部 self::静态属性名 类名::静态属性名 2.类的外部 如果要在类的外部访问静态属性,静态属性需要时public,否则不能直接访问 访问形式是: 类名::静态属性名 $this和self的区别 1.使用的方式不同 $this-> self:: 2.self