大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒
JS在ES6出了新的语法—类,可能是因为它之前太放荡了,导致不少问题,现在它终于有了一个面向对象的语法了。
首先是对象,这是什么就不用多解释了,事物的抽象。直接开锤语法
首先我们康康这是怎么写的
class Demo {
}
它没有和java一样有代表权限的前缀。直截了当
创建一个它的实例
let a = new Demo()
a使用let定义而不是Demo,因为js的若语言性,如果要追求极致的话建议学习Typescript
打印输出
产生一个空对象
那么如何要填充呢?
class aaa {
constructor(name, age) {
this.name = name
this.age = age
}
}
const a1 = new aaa("kaiqi", 15)
console.log(a1)
输出结果
constructor
是类中的构造器,每一个类中都有一个构造器,如果不写构造器,就默认有一个空构造器(和java的构造函数很像)
构造器的作用,当new 一个函数的时候,优先执行构造器中的代码
如果把它改成ES5的写法,是这样的
function Demo(name, age) {
this.name = name
this.age = age
}
let a = new Demo('kaiqi', 20)
console.log(a);
在一个对象里,肯定包含了实例属性和静态属性
它们的概念分别是什么呢?
通过new 出来的实例访问到的属性就是实例属性
还有一种属性叫做**静态属性,**就是通过构造函数直接访问到的属性
如何制造一个静态属性?
先看源码,再具体讲解
class bbb {
constructor(name, age) {
this.name = name
this.age = age
}
static app = "ddd2" //制造静态属性的方法2
static app() { // 制造静态方法的方法1
console.log('ok');
}
}
bbb.doSomething = () => { console.log }
bbb.info = "ddddd" //制造静态属性的方法1
const a2 = new bbb("kaiqi", 18)
bbb.sub = '1111' // 在实例化后,再插入一个属性,最后都会到对象里去(静态的属性到构造器里),而不会被抛弃。
console.log(a2.info) //这时输出undefined
console.log(a2.constructor.info) // 正常输出
console.log(bbb.info) //这时正常输出
- 方法1
类名.属性名
- 方法2
static 属性名
这个要写在类里面,java怎么来它也怎么来。
注意点:实例化之后就无法在实例化的对象里面直接找到,需要找到它的构造器实例对象.constructor
即可
如果要做判断,可以使用 实例 instanceof 类名
来判断某个实例对象的构造者是不是某个类
如何制造实例属性?
还是先看源码,再具体讲解
class aaa {
constructor(name, age) { // 方法1
this.name = name
this.age = age
}
app = 'app' // 方法2
}
const a1 = new aaa('kaiqi', 15)
a1.uid = 10001 // 方法2
console.log(a1)
输出结果
- 方法1
直接在class中定义 (详见上面的方法1) - 方法2
在构造函数中定义(详见上面的方法2) - 方法3
实例对象.属性名
最直接的方法(详见上面的方法3)
这还是比较好理解的
如何制造一个静态方法?
class Demo {
static app() { // 制造静态方法的方法1
console.log('ok');
}
}
Demo.doSomething = () => { // 制造静态方法的方法2
console.log('ok2');
}
Demo.app() // ok
let a = new Demo()
a.constructor.getSomeThing = () => { // 制造静态方法的方法3
console.log('get it!');
}
Demo.getSomeThing() // get it
- 方法1
类名.方法名
- 方法2
static 方法
— 和上面的定义静态变量一样,直接使用static前缀修饰 - 方法3
实例对象.constructor.方法名
这个方法真没必要,不推荐
如何制造一个实例方法?
class Demo {
app2() { // 制造实例方法的方法3
console.log('get it');
}
}
let a = new Demo()
a.doSomething = () => { // 制造实例方法的方法1
console.log('ok');
}
Demo.prototype.app = () => {
console.log('ok2'); // 制造实例方法的方法2
}
a.doSomething() // ok
a.app() // ok2
a.app2() // ok3
- 方法1
实例.方法名
- 方法2
类名.prototype.方法
— 和上面的定义静态变量一样,直接使用static前缀修饰 - 方法3
直接在类中定义(详见方法3)
总结
class是一个比较特殊的东西,它只能通过new来创建一个新的实例而不能像function一样直接调用。这是JS更新的一小步,也是js面向对象的一大步!