- 一、简介
- 二、类和原型
- 三、类和构造函数
- 1.简介
- 2.类标识,instanceof
- 3.constructor属性
- 四、使用class关键字的类
- 1.语法
- 2.静态方法
- 3.getter和setter方法
- 4.公有私有和静态字段
- (1)未来可能会标准化的class类体语法
- 5.关于super和extend
- 6.关于抽象类
一、简介
- 多个对象需要共享某些属性此时可以创建一个类,这个类就是创建对象的模板
- Javascript的类是基于原型继承而不是与Java一样基于类继承
- 在Javascript中,类意味着一组对象从同一个原型继承特征。因此,原型是类的核心特征。
- 构造函数是类的外在表现,通过构造函数代表一个类。一般构造函数名就是类名
- 调用构造函数创建对象的关键在于构造函数的prototype属性将作为新对象的原型。
- 所有对象都有原型,但只有少数函数对象有prototype属性。这意味着使用同一个构造函数创建的对象都有相同的原型,所有它们是同一个类的实例。
let arr = [];
let obj = {};
let fun = function () { };
console.log(arr.prototype);//undefined
console.log(obj.prototype);//undefined
console.log(fun.prototype);//{constructor: ƒ}
2.类标识,instanceof
- 类标识:原型就是类标识,而不是构造函数。
- instanceof检查对象是否为某个原型的实例,而不是检查是否是通过某个构造函数创建的这个对象
function Fun() { };
let f = new Fun();
console.log(f instanceof Fun);//这里检查的是f对象是否是Fun的prototype属性的实例,而不是检查f是否是通过Fun()创建的。
3.constructor属性
- 每一个函数都有一个prototype属性,这个属性值就是原型对象,而这个原型对象有一个constructor属性,这个属性就是当前的这个函数,可以通过这个特征进行反向引用
let F = function () { };
let p = F.prototype;
let c = p.constructor;
console.log(c === F);//true
--------------------------------------
let o = new F();
console.log(o.constructor === F);//true
四、使用class关键字的类
1.语法
- 工作原理与’三’完全一样,只不过语法更有面向对象的风格
class Student {
constructor(para) {
this.para = para;
}
eat() {
console.log('吃饭');
}
}
let student = new Student("text");
student.eat();//吃饭
student.para//text
2.静态方法
- 使用static关键字来修饰方法
class Student{
static eat(){};//这是静态方法
}
//类名加方法名调用:Student.eat();
3.getter和setter方法
class Person {
constructor(arg) { this.arg = arg; }
getArg() { return this.arg; }
setArg(arg) { this.arg = arg }
}
const person = new Person('text');
person.arg //=> text
person.getArg() //=> text
// 如果属性不私有化,其实写set和get方法根本没有意义
4.公有私有和静态字段
(1)未来可能会标准化的class类体语法
注释:ES6不允许创建类的属性,只允许创建方法。如果需要定义属性,则需要在构造函数中创建。
- 但是新语法支持定义属性,不过还没有标准化。
//公有字段
class Person {
name;
gender;
constructor(name, gender) {
this.name = name;
this.gender = gender;
}
}
const person = new Person("marry", "woman");
console.log(person.name);//marry
//私有字段,这里的#相当于Java的private
class Person {
#name = "";
#gender = "";
constructor(name, gender) {
this.#name = name;
this.#gender = gender;
}
getName() { return this.#name }
}
const person = new Person("marry", "woman");
person.getName();//marry
//静态字段
class Person{
static i = 10;//类体中,方法体之外定义静态变量
}
5.关于super和extend
解释:与Java一致,不再描述。
6.关于抽象类解释:略



