【JavaScript】- class基本语法

JavaScript 语言中,生成实例对象的传统方法是通过构造函数,es6的class 的出现 基本上可以替代了es5的构造函数和原型,使之代码结构上更加简洁。
1.构造函数的写法跟传统的面向对象语言(比如 C++ 和 Java)差异很大,很容易让新学习js的程序员感到困惑。
2.ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。
3.新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。

ES5 创建对象

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function () {
  console.log("hello, 我是" + this.name);
};

var p = new Person("lw", 36);
p.sayHi();

ES6 创建对象

class Person {
  constructor(name, age) {
    this.name = name;		// 属性
  	this.age = age;
  }

  sayHi() {		// 方法
 	console.log("hello, 我是" + this.name);	// sayHi是原型对象的属性
  };
}

var p = new Person("lw", 36);
p.sayHi();

constructor方法 

constructor()方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor()方法,如果没有显式定义,一个空的constructor()方法会被默认添加。  (类就是构造函数)

class Point {
}
​
// 等同于
class Point {
  constructor() {}
}
上面代码中,定义了一个空的类Point,JavaScript 引擎会自动为它添加一个空的constructor()方法。constructor()方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Foo {
  constructor() {
    return Object.create(null);
  }
}
​
new Foo() instanceof Foo
// false

上面代码中,constructor()函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。

类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。

class Foo {
  constructor() {
    return Object.create(null);
  }
}
​
Foo()
// TypeError: Class constructor Foo cannot be invoked without 'new'
 class Person {
      constructor(name, age, gender) {
        this.name = name
        this.age = age
        this.gender = gender
      }
      say() {
        console.log(this.name);
      }
    }

    class Student extends Person {
      constructor(name, age, gender, ss) {
        // super 一定要写在构造函数constructor里面,否则会语法错误
        super(name, age, gender)        // 就如Person.call(this,name,age,gender)
      }
      get m() {            // get是取值函数
        super.say()
      }
    }
    let per = new Person('rose')
    let stu = new Student('jack', 20, '男')
    console.log(stu);    // Student {name: 'jack', age: 20, gender: '男'}

    per.say()    // rose
    stu.m        // jack

猜你喜欢

转载自blog.csdn.net/m0_55960697/article/details/124085991