classmethod 继承_js es6语法 class类 class继承 super关键字(示例代码)

一,类的由来

es6提供了一个新语法就是class

二,class声明一个类

// 声明一个类

class Piont{ // Piont就是一个类

}

1,添加属性和方法

class Piont {

// 构造函数

constructor(name, age) {

this.name = name;

this.age = age;

}

// 方法

run(){

console.log(1);

}

}

2,使用方式

var p = new Piont(‘刘德华‘,30);

p.run();

console.log(p.name);

3,方法的写入

run(){

console.log(1);

}

对象调用的属性和方法叫做成员属性和方法,有类直接调用的属性和方法叫静态属性和方法

静态的属性指的是Class本身不是定义在实列对象上的属性

class Foo {

}

Foo.pop = 1; // 给Foo这个类定义了一个静态属性

console.log(Foo.pop);

4,内部添加静态属性

class Po{

static myP = 100; // 静态属性

constructor(){

console.log(Po.myP);

}

}

var p1 = new Po();

p1.constructor; // 调用

5,添加静态方法

class Foo{

static po = 100; //

static classMethod(){

return ‘hello‘;

}

}

6,this和方法重名

class Foo {

static bar() {

this.baz()

}

static baz() {

console.log(‘hello‘);

}

baz() {

console.log(‘world‘);

}

}

Foo.bar();

var f = new Foo();

f.baz();

7,父类的静态方法可以被子类继承

class Foo {

static classMethod() {

return ‘hello‘;

}

}

// 子类继承父类

class Bar extends Foo { // 子类继承父类

}

console.log(Bar.classMethod());

8,class继承

Class可以通过extends关键字实现继承,这比ES5通过修改原型链实现继承

class Point{

}

// 子类继承父类

class ColorPoint extends Point{

}

在ColorPoint内加上代码

class Point {

constructor(x, y) {

this.x = x;

this.y = y;

}

}

// 在ColorPoint内加上代码

class ColorPoint extends Point {

constructor(x, y, color) {

// this.color = color; // 错误

super(x, y); // 调用父类的constructor(x, y)

this.color = color; // 正确的

}

toString() {

return this.color + ‘ ‘ + super.toString;

toString()

}

}

let cp = new ColorPoint(20, 30, ‘green‘);

console.log(cp instanceof ColorPoint);// true

console.log(cp instanceof Point); // true

console.log(cp.x, cp.y, cp.color);

9,super关键字

既可以当做函数使用,也可以当做对象使用

当做函数使用的时候,代表的是父类的构造函数,es6要求,子类的构造函数必须执行一些super

class A{

constructor(){

console.log(new.target.name);

}

}

class B extends A{

constructor(){

super();// 代表的是父类的构造函数 但是返回的是子类的实列,内部的this指向的是子类的实列

// 相当于

// A.prototype.constructor.call(this);

}

}

console.log(new A()); //A

console.log(new B()); //B

super作为对象使用,在普通方法中,指向父类的原型对象,在静态方法中,指向的是父类

class A{

p(){

return 2;

}

}

// 继承

class B extends A {

constructor(){

super();

console.log(super.p()); // 2

}

}

let b = new B();

由于super指向父类的原型对象,所以定义在父类实列上的方法或者属性,是无法通过super调用

class A {

constructor() {

this.p = 2;

}

}

// 继承

class B extends A {

get m() {

return super.p;

}

}

let b = new B();

console.log(b.m);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`__class_getitem__`是Python 3.7中引入的一个特殊方法,用于动态创建泛型型。它是一个方法,用于获取一个的泛型参数,并返回一个新的泛型型。 `types.GenericAlias`是Python 3.7中引入的一个内置型,用于创建泛型型。它接受两个参数:`origin`和`args`。其中,`origin`表示泛型型的原始型,例如`List`、`Tuple`、`Dict`等;`args`表示泛型型的参数,例如`List[int]`、`Tuple[str, int]`、`Dict[str, float]`等。 当我们使用`__class_getitem__`方法来创建泛型型时,我们需要将其设置为`classmethod`,并将其定义为`types.GenericAlias`。这样,当我们创建一个泛型型时,Python会自动调用`__class_getitem__`方法来解析泛型参数,并返回一个新的泛型型。 下面是一个使用`__class_getitem__`和`types.GenericAlias`创建泛型型的示例代码: ```python import types class MyList(list): @classmethod def __class_getitem__(cls, params): return types.GenericAlias(list, params) # 创建一个泛型型 MyListInt = MyList[int] # 创建一个实例 my_list = MyListInt([1, 2, 3, 4, 5]) # 输出实例的型和值 print(type(my_list)) print(my_list) ``` 在这个示例中,我们定义了一个`MyList`,它继承自Python内置的`list`,并重载了`__class_getitem__`方法。在`__class_getitem__`方法中,我们使用`types.GenericAlias`创建一个新的泛型型,并将其返回。然后,我们使用`MyListInt = MyList[int]`创建一个`int`型的泛型`MyList`型,并使用`MyListInt([1, 2, 3, 4, 5])`创建一个实例。最后,我们输出实例的型和值,可以看到它是一个`MyListInt`型的实例,且其值为`[1, 2, 3, 4, 5]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值