返回

JS类、new、prototype与__proto__ 揭秘篇

前端

JS 语言中的类

在JS中,类是对JS中对象的分类。
JS中,类型有:数字、字符串、布尔、符号Symbol、null、undefined、对象。
一定,要区分开!!!!!!!

类型是对JS中数据的分类,类是对JS中对象的分类。

关于对象:

  • 变量就是用来引用对象的;
  • 对象是无序属性的集合;
  • 对象的每一个属性都由一个键名和一个键值组成;
  • 对象的属性是动态的,可以随时添加或删除。

创建对象有两种方法

    1. 直接写字面量的方式创建对象
    1. 使用 new + 构造函数的方式创建对象

1.直接写字面量的方式创建对象

const person = {
    name: "xiaoming",
    age: 18,
    sex: "male"
};

2.使用 new + 构造函数的方式创建对象

function Person(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
}
const person = new Person("xiaoming", 18, "male");

JS中类与对象的联系与区别

JS中,类是用来创建对象的,对象是类的实例。
类与对象的联系:

  • 类是对象的模板;
  • 对象是类的具体表现形式。
    类与对象的区别:
  • 类是抽象的,对象是具体的;
  • 类只能用来创建对象,对象不能用来创建类。

类与函数之间的关系

JS中,类是特殊函数。

class Person {
  constructor(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
}

上例,将类 Person 理解成特殊的函数:

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

类的原型对象

每个类都有一个prototype属性,prototype属性指向类的原型对象。
类的原型对象是一个普通的JS对象,它包含了类的共有属性和方法。

class Person {
  constructor(name, age, sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
  }
}

console.log(Person.prototype);

输出:

{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, __lookupSetter__: ƒ, isPrototypeOf: ƒ, propertyIsEnumerable: ƒ, toString: ƒ, valueOf: ƒ, }

proto

每个对象都有一个__proto__属性,__proto__属性指向对象的原型对象。
对象的原型对象是一个普通的JS对象,它包含了对象的共有属性和方法。

const person = new Person("xiaoming", 18, "male");

console.log(person.__proto__);

输出:

{constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, __lookupSetter__: ƒ, isPrototypeOf: ƒ, propertyIsEnumerable: ƒ, toString: ƒ, valueOf: ƒ, }

类的继承

JS中,类可以继承其他类,继承是指子类可以访问父类的属性和方法。

class Father {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  sayHello() {
    console.log("Hello, I'm " + this.name + ", I'm " + this.age + " years old.");
  }
}

class Son extends Father {
  constructor(name, age, school) {
    super(name, age);
    this.school = school;
  }

  sayHello() {
    super.sayHello();
    console.log("I'm from " + this.school + ".");
  }
}

const son = new Son("xiaoming", 18, "Tsinghua University");

son.sayHello();

输出:

Hello, I'm xiaoming, I'm 18 years old.
I'm from Tsinghua University.

总结

JS中,类是用来创建对象的,对象是类的实例。
类与对象的关系是,类是对象的模板,对象是类的具体表现形式。
类的原型对象是一个普通的JS对象,它包含了类的共有属性和方法。
对象的__proto__属性指向对象的原型对象。
JS中,类可以继承其他类,继承是指子类可以访问父类的属性和方法。