抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前端零碎知识点

dotted line虚线

1
2
3
4
Div:hover{      鼠标停留时样式改变
opacity: 0.4 改变标签不透明度
}

Italic倾斜,斜体

字间距:

Letter-spacing: -2px;

范围:最大数值为自大小

单位:像素

设置按钮跳转:

1
<input type="botton" value"我是一个按钮" onclick="location.href='http://www.baidu.com'">

onclick=”location.href=’跳转本地地址’”

onclick点击时的动作

1
2
3
4
5
6
7
8
9
10
11
12
单独添加一个链接,实现跳转:
<input type="button" value="我是一个按钮"
οnclick="javascrtpt:window.location.href='http://blog.sina.com.cn/mleavs'">

触发一个函数跳转:
<script>
function jump(){
window.location.href="http://blog.sina.com.cn/mleavs";
}
</script>

<input type="button" value="我是一个按钮" οnclick=javascrtpt:jump()>

border:double(双线)

border:dashed(虚线)

border:dotted(点线)

List-style:none (列表样式——无)

position位置

size尺寸

background-position:

(背景)

雪碧图、精灵图,当背景,减少http请求次数

通过定位设置图片


10月15日

Transparent 透明

odd(奇数)

even(偶数)

设置

Box-sizing:border-box

设置box-sizing width和 height是盒子的实际宽高,不是内容的宽高,设置之后内容将自动调整

Outline:none

设置input输入标签被选中时的边框无

Display:none

显示隐藏


10月17日周六

定位

用于元素的定位

三个类型:

  1. 相对定位(属性值relative):参照自身位置进行定位
  2. 绝对定位(absolute):参照有定位设置的第一级父级元素位置进行定位
  3. 固定定位(fixed):参照浏览器窗口位置(body区域)进行定位

position语法

1
2
3
4
5
6
7
8
div{
width:100px;
hight:100px;
position:relative(相对自身位置);
left:20px(距元素自身左边框20像素);
top:20px(距元素自身顶部20像素);
/* right、和bottom相同意义方向不同 */
}

“应用说明:先确定定位类型,后输入值


10.22

hydrasender

user:itxiaowei

Password:

Text-indent(文本缩紧)

只针对块元素,不可用于行内元素


10.12

label标签(扩大点击范围)

cheaked伪类选择器(当input选中时)

+并排(隔壁)兄弟选择器

1
2
3
<p>
<input>
p标签和input标签为隔壁兄弟

~隔行兄弟选择器

currentcolor(目标元素颜色)

current(英文单词现在的)

1
2
3
4
5
6
.box{
color:red
box-shadow: 0 0 5px currentcolor;
}
阴影的颜色也是red

自适应宽高

1
2
3
4
5
6
.box{
width: calc(100% - 200px);
宽 : 计算(父元素的100% - 200px)
height: calc(100% - 100px);

}

calc计算

最大最小宽高

Min-width 最小宽度

Max-width 最大宽度

min-height 最小高度

max-height 最大宽度

文字对其方式

text-align:justify—–属性值(文字两端对其)

文字显示超出用省略号现实

White-spance:nowrap ; (文字不换行)

text-overflow:hidden (文字隐藏)

需要搭配overflow:hidden使用

writing书写 mode模式

Writing-mode: vertical-rl (文字从右往左显示)

Writing-mode: vertical-lr (文字从左往右)

Writing-mode: vertical-tb(文字从上往下)

Writing-mode: vertical-lr (文字从下往上)

input输入框的value限制长度

maxlength=”10”

target a标签的目标属性

target 目标

1
2
3
4
5
6
a标签点击之后跳转,:target(伪类选择器),target目标激活,设置样式改变
仅用于a标签
a:target .box{
display:none
}
a标签点击之后跳转,target目标激活,使用:target(伪类选择器),设置类名为box的盒子display(显示模式):none(无)隐藏

伪类选择器

:first-letter{}

选择器:第一个字母{样式}

:first-line{}

选择器:段落第一行{样式}

第一行

letter:

*letter 信;函;字母

1英寸(in)=2.54.cm


10月26日

浮动兼容(IE浏览器)

需要添加属性

zoom:1

图片文字对其方式

Vertical-align:middle

(基线对其)

斜体标签

加粗标签

斜体标签

删除线标签


10月28日

文字和图片基线对齐

1
vertical-align: middle

字体行高复合写法

1
Font:12px/1.5

字体大小12px,行高为字体大小1.5倍

强制一行显示&多出内容用省略号(…)代替

1
2
3
4
5
6
white-space: nowrap;
/* 强制一行显示 */
overflow: hidden;
/* 超出隐藏 */
text-overflow: ellipsis;
/* 超出内容用...显示 */

11月4日

字间距

1
letter-spacing:2px

点击伪类

设置鼠标点击按下不松手的样式效果

1
2
3
.p:active{
background-color: red
}

元素鼠标停留变小手:

元素:hover{

cursor:pointer

}


css动画:

前置:

需要给要设置动画的元素写上css动画属性animation

animation-name 规定需要绑定到选择器的 keyframe 名称。。
animation-duration 规定完成动画所花费的时间,以秒或毫秒计。
animation-timing-function 规定动画的速度曲线。
animation-delay 规定在动画开始之前的延迟。
animation-iteration-count 规定动画应该播放的次数。
animation-direction 规定是否应该轮流反向播放动画。

animation复合写法一共有5个属性值

属性值1 :动画名称(自定)

属性值2 :每次播放时长(单位秒s)

属性值3 :动画播放速度

描述
linear 匀速
ease 慢快慢
ease-in 慢快
ease-out 匀速减慢
ease-in-out 慢速开始,先加速后减速

属性值4 :动画播发延迟(单位秒)

属性值5 :动画播放次数(无限重复infinite、forwards保持动画停止后的效果)

设置动画进度css样式的改变:

@keyframes 动画名 {}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
div{
animation: loading 2s linear 0s infinite
/*第一个属性值为动画名称 ; 第二个属性值为每次动画的时长 ; 第三个属性值为动画播放的速度 ; 第四个属性值为为延迟几秒开始动画 ; 第五个属性值为播放次数 */
}

@keyframes loading {
/* 动画进度设置 */
0%{
transform: rotate(0deg); // 旋转度数0
opacity: 0; /* 不透明度0 */
}
50%{
transform: rotate(180deg); //旋转度数180
opacity: 1; /* 不透明度1 */
}
100%{
transform: rotate(360deg); //旋转度数360
opacity: 0; /* 不透明度0 */
}
}

css3动画:

transform

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
旋转:
transform: rotate(45deg)
/*旋转45度*/

缩放:
transfrom: scale(2,2)
/* 只写一个参数为整体缩放
写两个参数为:参数1为元素宽的缩放倍数,参数2为高的缩放倍数
*/

平移:
transfrom: translate(100px)
/* 只写一个参数 为X轴方向平移(左加右减)
两个参数 分别代表X轴和Y轴的平移量
*/

旋转中心点:
transfrom-origin:
/* 旋转中心点设置(X轴位置,Y轴位置) */

复合写法:
tansfrom: rotate(45deg) translate(100px) scale(1.5)
/* 旋转 平移 缩放
*/

旋转:

transform

用于将元素旋转

1
2
3
4
5
div{
transform:rotate(90deg)
div旋转90
}


12.17

Div可输入属性:

contenteditable=”true”

Css属性选择器 [ ]:

1
2
3
4
Input[type=checked]2{ 

}
/* 选择类型type 为 checked 的 input的标签 */

中括号里写属性和属性值,精准选择对应的input标签


允许块元素输入内容:

contenteditable属性

1
2
3
<div contenteditable='true'>

</div>

通过value属性直接获取输入的内容


2021.3.16

2021.3.18

css3渐变

线性渐变:

linear-gradient为 线性 渐变颜色(括号内颜色可以添加多个,多种颜色渐变)

注意事项:

  1. 第一个参数定义方向,渐变的方向(选填)
  2. 第二个往后为颜色参数,有多少个颜色就填多少个参数
  3. 括号第一个参数填写度数可让渐变旋转角度
  4. 括号里颜色后面跟数值可以让颜色纯色位置保持数值大小,从而使渐变区域变小、可控
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.box{

background-image : linear-gradient(red, blue)
/* linear-gradient为渐变颜色(括号内颜色可以添加多个,多种颜色渐变) */

background-image : linear-gradient(to right,red,blue)
/* 设置to right(方向词)可以让渐变从左往右 */
to top 从下往上
to left 从右往左
to bottom 从上往下

background-image : linear-gradient(45deg , red,blue)
/* 括号第一个参数填写度数可让渐变旋转角度 */

background-image : linear-gradient(to right,red 100px,blue 200px)
/* 括号里颜色后面跟数值可以让颜色纯色位置保持数值大小,从而使渐变区域变小、可控 */

}

镜像渐变:

radial-gradient

除第一参数,其余同上

第一参数:

1
2
3
.box{

}

11.18(javascript)

变量交换:

方式1

1
2
3
4
5
6
7
a = a + b 

b = a - b

a = b - a

a b交换数据

方式2

1
2
3
var c = a + b;
b = c - b
a = c - a

方式3

1
[a,b] = [b,a]

次方计算:

Math.pow(x,y) = x^y

Math.pow(2,2) = 4

Math.pow(2,3) = 8

Math.pow(2,4) = 16


11.20

定义数组 var arr = [1,1,5,5,6,8,4,7,5,6]

多维数组转一(指定数值)维数组

flat(x)

语法:数组名.flat(x)

多维数组

二维数组[[12,13],[20,30]]

三维数组[iii,didi,bilibili,[acac,[45,46],[12,15],48],aaa,bbb]

….多维数组

删除数组数据

数组名.length = x

x为删除数组数据到第几项


11.23

js块级域

使用花括号括起来的代码为块级域

1
2
3
{
块级域代码
}

let —— 作用于块级域中的变量定义

ECMAscript 6(ES6)中的语法

1
2
3
{
let num = 100
}

11.24

数组常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
增加数据:
1.从前加
var r = 数组名.unshift(数据);
2.从后加
var r = 数组名.push(数据);

共性:
1.返回值r都是数组最新的长度

区别:
1.unshift()从前添加数据
2.push()从后添加数据

注意:
1.push 可以从后添加多条数据
2.unshift 可以从前添加多条数据


删除数据
1.从前删
var r = 数组名.shift()
2.从后删
var r = 数组名.pop()

共性:
1.返回值是删除的数据

区别:
1.shift()从数组最前面删除一项数据
2.pop()从数组最后一项删除数据


splice:实现增删改项

新增:
数组名.splice(参数1开始操作的项的下标,0,参数3时新增数据);

删除:
数组名.splice(参数1开始操作的项的下标,大于0的正数);

删除:
数组名.splice(参数1开始操作的下标,大雨0的正数,参数3新增的数据);

注意:
1.splice会修改原数组
2.返回值是空数组(一般用不到)



slice:截取数组中的数据


数据名.slice(参数1,参数2);

注意:
1.slice(参数1)从参数一开始到数组的末尾项(length)
2.slice(参数1,参数2)截取数组,[)
从参数1后一位开始截取,截取参数2 个字符

indexOf:
找数组中对应的数据的下标
语法:数组名.indexOf(数据)
var i = 数组名.indexOf(数据) // i为查找到的下标
查找不到输出值为 -1
indexOf('数据',下标) // 查找数据,从下标几开始找

作用:
1.查找数组中某项数据的数组中下标
(如查找到第一个数据的下标会停止输出)
2.判断该数据在数组中是否存在
返回值>=0 说明存在
返回值为-1 说明数组中不存在该数据

es7中的includes
1.判断数组中是否包含该数据
返回值为true 说明数组中有该数据
返回值为false 说明数组中不包含该数据

indexOf 和 includes区别
includes可以严格校验, 比如NaN 而indexOf做不到

反转数组的顺序reverse
数组名.reverse()

lastIndexOf从后往前查找数据下标


拼接操作join(可将数组拼接为字符串)
arr.join('|') //项与项之间用|拼接


数组拼接 concat
arr1.concat(第二个数组名)
需要一个变量来接收存储

栈内存和堆内存

Item

forEach

map排序(冒泡排序)

1
map()

Sort升降序

sort ( function(a,b){ return a-b; } )

filter(塞选、过滤)


11.25

创建随机数[0,1). 范围为0~1的范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
创建随机数[0,1).         范围为01的范围
var r = Math.random()

向下取整 Math.floor
var a = 10.19
var b = Math.floor(a)

向上取整 Math.ceil()
alert(Math.ceil(10.256))
弹出10

四舍五入(取整) Math.round()
alert(Math.round(10.456))
弹出10
alert(Math.round(10.758))
弹出11
注意⚠️:如果数字是负数( 如-1.5则向下取到-1 )
:如果数字是正数( 如1.5则向上取到2)

指数 pow(n,m) n:底数 m:指数
alert(Math.pow(3,4));

绝对值
var a = -324
abs
Math.abs(要取绝对值的数)
输出 324



字符串

字符串分割(可讲字符串转成数组)

1
2
3
4
5
6
7
8
9
10
11
12
字符串分割(可讲字符串转数组)
var str = '1+2+3+4+5'
str.split('+')
输出数组[1,2,3,4,5]

//利用分割符,使用字符串里没有的东西分割,直接将整个字符串转成数组,下标为0


拼接操作join(可将字符串转成数组)
arr.join('|') //项与项之间用|拼接


字符串截取

1
2
3
4
5
6
7
8
9
10
11
12
substring: 
var str = "我在中华人民共和国"
var r = str.substring(下标,下标); //包头不包尾[下标,下标)
//从下标几到几截取

substr:
var str = "我在中华人民共和国"
var r = str.substr(下标,下标往后几位字符) //
变量名.substr(start,length) //往后截取length个数据
//从下标几往后截取多少位

变量名.slice(start,end) //包头不包尾[start,end)

字符串替换(也可用于数据替换)

1
2
3
4
5
6
7
8
str.replace(要替换的字符串,替换上去的字符串)

var str = 'I am loser, you are loser, all are loser.'
var str_new = str.replace("loser","hero")
console.log(str_new)
输出 I am hero, you are loser, all are loser
注意此方法只能替换一次,需全部替换请配合遍历使用.

字符串转大小写

1
2
3
4
5
6
7
var 变量名 = 'good good study,day day up'

字符串转大写
变量名.toUpperCase()

字符串转小写
变量名.toLowerCase()

去除空格:

1
2
3

.trim()

string字符串形具有不可变性

some循环查找(只要有一个条件成立将退出循环)——方法

相当于while循环查找指定值,查得到为true(查到第一个后续不在查找)查不到为false,并返回布尔值,可用变量存储

1
2
3
4
5
6
7
8
9
10
语法:
数组名.some(function(变量名){ // 变量名链接的是数组名(可随机设置)
var r = 变量名
})


users.some(function(item)){
var r = users数组中的每一项 == 数据
return r
}

=>指向

a => b

相当于将一个判断条件,或者运算值附给变量

1
2
3
4
a => b  // 将b的值附给a
a => 100 > 50 //判断100>50的真假,并将布尔值附给a
a => fn() //将函数fn 的值附给a
a =>

11.26

时间获取Date()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
创建时间对象:
var nowTime = new Data()


在控制台打印时间
console.log(Data())

日期相关参数获取:

年:
nowTime.getFullYear()
月:
nowTime.getMonth()
日:
nowTime.getDate()
星期:
nowTime.getDay()
时:
nowTime.getHours()
分:
nowTime.getMinutes()
秒:
nowTime.getSeconds()


11.27

对象解构附值

1
2
3
4
5
6
7
8
9
10
11
var 对象名 = {name:'小明',age:20,sex:'男',love:'study'}
var {a,b,c} = 对象名
相当于:
var {a,b,c} = {name:'小明',age:20,sex:'男',love:'study'}
将name键值附给a变量
将age键值附给b变量
将sex键值附给c变量
可以直接:
对象名[a] 访问name的值
对象名[b] 访问age的值
对象名[c] 访问sex的值

11.30

对象名.属性名 和 对象名[属性名] 的区别

区别:前者的属性名有要求,属性之间不能有空格,并且为固定值

后者用中括号的一般是变动的值(比如变量,和变化的键名key)

1
2
对象名[属性名] 和 对象名['属性名'] 的区别
中括号里的属性名一般为变量,中括号里包一层引号会变为固定的值(相当于字符串)

12.1

this

1
2
3
4
5
this 表示 当前对象
this.name 表示 当前对象里的name键的值



set去重

去除数组中重复的项

1
2
3
var arr = [1,2,4,4,5,4,6,7,8]
var arr0 = new arr.set


12.3

数组填充

给数组填充内容

1
2
3
数组名.fill(填充内容)
填充满
arr.fill()

12.4

用变量填充对象的键名需使用[a] 中括号框起来

1
2
3
4
5
var arr = []
var a = '小明'
arr.push( {[a]:666} )
console.log(arr)
输出: [{小明:666}]

12.8

立即执行函数:

自适应函数.

作用:避免变量冲突

1
2
3
4
5
6
// 立即执行函数()();
(
function fn (){
alert(100)
}
)()

12.10

let区域变量定义:

let不存在预解析,使用时需要在使用变量之前使用let定义变量


12.14

Array.from()转数组

作用 : 用于将伪数组转为正常数组

语法:Array.from(伪数组) 伪数组可以是变量存的伪数组

语法:

1
2
3
4
5
6
function fn1(){
//将接收到实参伪数组转为正常数组,并返回
return Array.from(Arguments) //Arguments函数里接收实参的伪数组
}
var d = fn1(1,2,3,4,5,6) //传入实参
console.log(d) //输出[1,2,3,4,5,6]

…数组解构:

通过在数组前写…
可将数组解构成()包裹的形式,也就是单个单个的项

1
2
3
4
5
6
var arr = [1,30,20]
console.log(...arr) // 控制台输出: 1 30 20
// 通过在数组前写...
// 可将数组解构成()包裹的形式,也就是单个单个的项
console.log(Math.max(...arr)) //求最大数
// 控制台输出 30

…[‘数’,’组’,’解’,’构’] ==>. (‘数’,’组’,’解’,’构’)

…字符串解构 ==> 字 符 串 解 构

注意⚠️:将数组或字符串框架拆碎,元素掉落

…还可以用于对象

…转数组


javascript确认框

1
window.confirm("sometext");

change事件:

onchange 事件会在域的内容改变时发生,

onchange 事件也可用于单选框与复选框改变后触发的事件。

查找元素下表的方法indexOf.call :

1
let index = [].indexOf.call(mts.parentNode.querySelectorAll('li'),mts)

利用数组里的indexOf内容查找下标

语法:

1
[].indexOf.call()

对象严格判断:

作用:判断两个对象是否严格意义上一样

Object.is(参数1,参数2)

参数1 和 参数2 比较

例 :

Object.is(NaN,NaN); 返回值为true

Object.is(100,’100’); 返回值为false


jQuery拓展

$.Deferred等待异步代码执行完毕执行其他函数(一般用在定时器)

.done()里边传

1
2
3
4
5
6
7
8
9
let dfd = $.Deferred()
setTimeout(function(){
alert(1);
dfd.resolve();
})

dfd.done(function(){
alert(2);
})

javascript高级

立即执行函数

像这样两个小括号堆起来的函数就叫立即执行函数

特点 :会立即执行,也可用变量保存起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 立即执行函数
(function (){
console.log(this) // window
})()
// 变量保存
var fn = (function (){
console.log(this)
})()
// 可调用执行
fn() // 控制台输出window
// 参数传递
var a = 100
(function (num){
console.log(num) // 100
})(a)

对象扩充方法assign

assign()

参数1:要扩充的对象

参数2以后的参数为扩充的对象

1
2
3
4
5
6
var obj = {};
var o1 = {name:'小明'};
var o2 = {age:20};
obj.assign(obj,o1,o2)
console.log(obj)
// {name:'小明',age:20}

toString和String的区别

1
2
toString不能转undefinednull
String可以转undefinednull

2021

URL.createObjectURL()方法

此方法可以将文件对象生成一个url地址(blob类型地址)

将文件对象放到括号里,就会返回一个地址字符串

一般用于上传图片实时预览

1
2
let url = URL.createObjectURL(formdata.flies[0])
console.log(url) // blob地址

css新增内置计算方法calc()

用于计算

1
2
3
4
.box{
margin: calc(200px /2)
/* 会自动计算结果会识别为 margin:100px */
}

html块元素限制两行,多余文字显示(…)

-webkit-box-orient元素内容布局方式
-webkit-line-clamp元素内容行数限制
超出内容隐藏text-overflow: ellipsis;

word-break: break-all; 长单词不换行问题

1
2
3
4
5
6
7
8
/* 盒子内容垂直布局 */
-webkit-box-orient: vertical;
/* 超出两行 */
-webkit-line-clamp: 2;
/* 内容超出长度显示(...) */
text-overflow: ellipsis;
overflow: hidden;
/* 解决长单词不换行问题 */

ES6模块化(企业常用)

ES6 模块化导入/导出

注意⚠️:两种方式必须配合着使用,不然会出错。

方式一

1
2
3
4
// ES6 模块化导出
export default (变量、函数、对象、数组...任意值)
// ES6 模块化导入
import 变量名 from '文件路径'

方式二

1
2
3
4
// ES6 模块化导出
export let/const/var 变量名 = 值(任意数据类型)
// ES6 模块化导入
import {变量名} from '文件路径'

导入导出需在运行web服务的情况下才有用

user-select阻止选取内容(css样式)

user-select:auto (默认可选取)

user-select:none(不可选取)


vue

tamplate模版为html5新增标签,但并非dom元素,而是一个结构模版,不会生出DOM,只会根据template标签内容生产DOM

1
2
3
<template>
DOM结构
</template>

output 和 break

用output和break包括的循环嵌套会全部停止

1
2
3
4
5
6
7
output
for(var i = 1 ; i < 10 ; i++){
for(var j = 1 ; j < 10 ; j++){
break
}
}
// 跳出多断for循环

对象的解构赋值

1
2
3
4
var obj = {name:"张三"age:20,stu:{love:"coding"}}
var {name,age,stu:{love}}
console.log(name,age,love)
// "张三" 20 "coding"

对象的删除

1
delete obj.name

对象的解构

1
Object.setPrototypeOf()

ES6对象内置类

Object.fromEntries() - ES10语法

解决问题:二维数组转对象

用法:

1
2
3
var a = [['name','张三'],['age',20]]
var b = Object.fromEntries(a)
console.log(b) // {name:'张三',age:20}

Number.Max_SAFE_INTEGER 数字整型最大值

=9007199254740991

BigInt() 转大整型
1
2
3
4
let num = Number.Max_SAFE_INTEGER
let bigNum = BigInt(num+=10)
console.log(bigNum)
// 9007199254741001

localeCompare()

字符串的api,用来比较字符串的ascii码大小,多用于sort冒泡排序,而中文在ASCII码表中是以字的拼音字母排序的

语法:

1
2
3
4
str1.localeCompare(用来比较的字符串,locales)
// locales为选填
// 当str1的ASCII码比用来比较的字符串小时,返回值为-1
// 当str1的ASCII码比用来比较的字符串大时,返回值为1

返回值为一个 1和-1

比如:

1
2
3
4
let arr = ['李四','阿飞','张三']
let newArr = arr.sort(function(a,b){
return a.localeCompare(b)
})

set[].has()判断set数组中是否包含某项数据

1
2
let str = "张三"

ES10可选参数:

1
2
3
4
5
6
7
8
9
function fn(a){
// let ip = a && a.database && a.database.ip;
// 可选参数
let ip = a?.database?.ip
console.log(ip)
}
fn({})

以上a?.database?.ip和ip = a && a.database && a.database.ip;等价

PYTHON

1
2
__mro__ 可以打印面过程
print(b.__mro__)

评论