- es6之前:没用关键字
- es6之后:用关键字constructor, static来定义实例方法属性,静态方法,静态属性
es6之前
/*
1.在ES6之前如果定义一个类?
通过构造函数来定义一个类
*/
/*
function Person(myName, myAge) {
// 实例属性
this.name = myName;
this.age = myAge;
// 实例方法
this.say = function () {
console.log(this.name, this.age);
}
// 静态属性
Person.num = 666;
// 静态方法
Person.run = function () {
console.log("run");
}
}
// let p = new Person();
let p = new Person("zs", 18);
p.say();
console.log(Person.num);
Person.run();
es6
- 从ES6开始系统提供了一个名称叫做class的关键字,这个关键字就是专门用于定义类的
- Person后面没有(),可以传参数,new的时候constructor接受参数
- 实例方法写在constructor里面,静态方法属性写在constructor外面
class Person{
// 当我们通过new创建对象的时候, 系统会
//自动调用constructor
// constructor我们称之为构造函数
constructor(myName, myAge){
this.name = myName;
this.age = myAge;
}
// 实例属性
// name = "lnj";
// age = 34;
// 实例方法
say(){
console.log(this.name, this.age);
}
// 静态属性
static num = 666;
// 静态方法
static run() {
console.log("run");
}
}
// let p = new Person();
let p = new Person("zs", 18);
p.say();
console.log(Person.num);
Person.run();
注意点:
- 构造函数里面定义实例属性,有些浏览器不支持的,要写在constructor里
// 实例属性【这样写有些浏览器不支持的,要写在constructor】
name = "lnj";
age = 34;
实例方法
- 构造函数里面定义静态属性,一些浏览器不支持,静态方法可以。
class Person{
// 静态属性【es6标准版不支持这样,会报错,仅静态方法ok】
static num = 666;
// 静态方法
static run() {
console.log("run");
}
}
// 静态属性【这样写不会报错】
Person.num = 666;
es6之前给原型对象添加方法属性
function Person(myName, myAge) {
this.name = myName; // stu.name = myName;
this.age = myAge; // stu.age = myAge;
this.hi= function () {
console.log("hi");
}
// return this;
}
Person.prototype.say = function () {
console.log(this.name, this.age);
}
let p= new Person();
console.log(p);
Person.prototype.say,say在proto
es6给原型对象添加方法属性
class Person{
// 当我们通过new创建对象的时候, 系统会自动调用constructor
// constructor我们称之为构造函数
constructor(myName, myAge){
this.name = myName;
this.age = myAge;
this.hi= function(){
console.log(this.name, this.age);
}
//都在对象上
}
say () {
console.log(“k”);
//在原型链上
}
}
- 不在constructor 定义的属性方法,自动挂载在原型对象上
还有,用es6 class定义类A,如果给类添加一个原型对象,比如是obj,那么!obj内的属性方法,A的实例是找不到的!,因为在A内,不在constructor定义的方法C就自动挂载到原型对象B上,而此时已经有了原型对象obj,就是说在A内产生的原型对象B,已经没有用了!因为已经有了obj了!~,打印A的实例,在proto是看不到C方法的,并且A的实例也访问不到obj里的方法和属性,因为es6不允许。
就是说,通过es6定义的类,不能自定义原型对象,因为es6已经帮我们弄好了,比如类A内,不在constructor定义的方法C就自动挂载到原型对象B上