面向对象

java是面向对象的语言,以类为基石,进行封装,继承和多态的实现

什么是类?

人类是人类,人类又属于哺乳动物属于哺乳类,哺乳类又属于动物类,所以某个人是人类的实例。

封装

人有很多隐私,年龄,名字,身份证号码等,都属于个人隐私,我们不能让外部随意去访问这些属性,在java中我们使用private声明属性, 在js中,我们在实例内部使用this访问实例内部的属性,通过提供适当的接口,向外部提供属性的暴露,这些都放在 prototype.constructor 中

  1. function Person(age,name){
  2. this.name=name;
  3. this.age = age;
  4. this.say = function(){
  5. console.log('my name is'+this.gromy+',im '+this.age+'years old')
  6. }
  7. }

继承

人类有人类的共性,会说话会行走,这种技能在制造的时候每次都去创建太麻烦了,我们在人类中定义了说话行走等技能,供实例直接复用,在prototype中定义

  1. Person.prototype.eat(){
  2. console.log('i like eat 麻辣烫')
  3. }

多态

中国人喜欢吃麻辣烫,美国人喜欢吃汉堡,日人本爱吃人,不同的人 对使用 eat 这个方法又有不同的表现,这就是多态。
多态的实现是通过继承后对eat的重写实现的
JAVA伪代码

  1. American extends Person(){
  2. eat(){
  3. console.log('i like eat humberger')
  4. }
  5. }

而js实现这些,通过在对象上定义一些属性 constructor,prototype,proto来实现的,这一系列知识点俗称原型链

js原型链

属性介绍

constructor

构造器,可以叫做类的模版,用new 创建实例时候 调用基类的constructor,this 指向实例的内部,所有的 constructor 都是 Function 创建的,而通过constructor创建的实例都是object

prototype

基类上用于存放constructor和需要继承的属性

  1. Person.prototype
  2. {walk: ƒ, constructor: ƒ}

proto

存在于实例上,用于记录这个实例的基类位置

  1. 实例.__proto__ == 基类.prototype

自顶向下分析原型链

万物皆空,空生万物
我们知道,js的基类是Object 和 Function ,拿它们的基类是什么呢?

Object 和 Function 是谁的实例?

  1. Object.prototype.__proto__ = null
  2. Function.prototype.__proto__= Object.prototype

所以原型链的最顶层是NULL
Function 这个类 是Object 的实例
像这样的基类还有

  1. Math.__proto__ == Object.prototype

Object.prototype是最基础的基类 Math

  1. Math.prototype == undefined

说明Math这个包装类 不需要被实例化和继承

  1. function Person(age,name){
  2. this.name=name;
  3. this.age = age;
  4. this.say = function(){
  5. console.log('my name is'+this.gromy+',im '+this.age+'years old')
  6. }
  7. }
  1. Person.prototype.__proto__ == Object.prototype

Person这个基类 是 Object 的实例,我们说,不是function创建出来的吗? 我们知道,创建势力是通过 new ,调用了基类的 constructor,在这里我们用function,function 只能创建 constructor, 用function声明的基类,是带有 constructor 的 Object

  1. let gromy = new Person(18,'gromy')
  2. gromy.__proto__ == Person.prototype

所以有

  1. 实例.__proto__ == 基类.prototype

他们都指向Person的构造函数
我们可以理解为
所有的实例的基类都是Object
所有基类的constructor 都是 通过Function 创建的

  1. Object.__proto__
  2. ƒ () { [native code] }
  3. Function.__proto__
  4. ƒ () { [native code] }
  5. Function.prototype
  6. ƒ () { [native code] }

所以Object 和 Function 都是 ƒ () { [native code] } 的实例
ƒ () { [native code] } 可以理解为 生成
image.png
在向下所有的实例都会继承这些内容?