前端学习-JavaScript(

72 阅读3分钟

JS的继承

JavaScriptJavaScript 类继承使用 extends 关键字。继承允许我们依据另一个类定义一个类,这使得创建和维护一个应用程序变得更容易。

当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类(父类) ,新建的类称为派生类(子类)

语法

//父类
class Father{  }
//子类继承
class Son extends Father {  }

例子

//父类
class Father {
    constructor(sonname) {
        this.sonname = sonname
    }
    say() {
        console.log("你的姓是" + this.sonname);
    }
}
//子类继承
class Son extends Father {
    //这样就继承了父类的属性和方法
}
let yours = new Son("王")
yours.say()

你的姓是王

super()super() 方法用于调用父类的构造函数

//父类
class Point { // 定义了一个名字为Point的类
    constructor(name, age) { // constructor是一个构造方法,用来接收参数
        this.name = name
        this.age = age
    }
 say() {
        return `我是${this.name},我今年${this.age}`
    }
}
let p1 = new Point("史迪奇", "600")
// console.log(p1);



// 子类 
class Student extends Point{
    dance
    constructor(name,age,dance){
        super(name,age)
     this.dance=dance
  
    }
    study() {
        return `我是${this.name},我喜欢学习孙子兵法`
    }
    jump() {
        return `告诉${this.name},我想吃鱼`
    }
}
let p2 = new Student("高启强","29")
let p3=new Student("老默" )

console.log(p2.say());
 console.log(p2.study());
console.log(p3.jump());


p2.say():我是高启强,我今年29
p2.study():我是高启强,我喜欢学习孙子兵法
p3.jump():告诉老默,我想吃鱼

原型链

部分画图解析

image.png

函数对象 : 就是平时称的对象;

实例对象 : new出的对象或者{ };

原型对象 : 所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的。

prototype、proto、 constructor三者之间的关系

prototype :原型(原型对象)指向的都是原型

proto:指向的都是原型

constructor:原型上的属性:指向的是构造函数

①每个对象都有一个隐式的属性(proto),属性值本质上就是一个普通的对象

②每个函数对象都有一个原型属性(prototype),属性值本质上就是一个普通的对象

③每个对象的__proto__指向构造函数的原型对象(prototype)

④原型对象上有constrctor属性,指向构造函数

  //万物皆对象,实例化也是一个对象,看它是否指向构造函数Str的prototype原型对象,实例化对象是由构造函数创建的
  console.log(s1.__proto__);//指向str的原型对象
  console.log(Str.prototype);//指向str的原型对象
  console.log(s1.__proto__ === Str.prototype);//true

  console.log(s2.__proto__);//指向str的原型对象
  console.log(Str.prototype);//指向str的原型对象
  console.log(s2.__proto__ === Str.prototype);//true

  //Str也是一个对象,有一个隐式的属性(__proto__),构造函数的原型对象是由Object创建的
  console.log(Str.prototype.__proto__);//指向Object的原型对象
  console.log(Object.prototype);//指向Object的原型对象
  console.log(Str.prototype.__proto__ === Object.prototype);//true

  //Object也是一个对象,有一个隐式的属性(__proto__),Object的原型对象__proto__ 为null
  console.log(Object.prototype.__proto__);//null,指向为空
  
  

递归

递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用

这是百度百科的解释,拿C语言来说,一个很常见的知识是,除了主函数,其他函数都可以调用自身或者出自身外的函数(除主函数)。就好比俄罗斯套娃,一层接着一层。而我个人对于递归的理解主要有两个方面,一个是递,一个是归。
递,就是层层深入,不断向里的过程。但是递总不能是无限的,计算机不能解决无限大的问题,所以这个递,总是要有个一个出口的,在程序中来说,就是某个条件,一旦达成了这个条件,递归中的第一过程便不再进行,从而转向第二过程的归。
归,就是回归、归纳的意思,既然递是层层深入的,那归便是从最深的一层层层向外,直到达到最外层,结束递归。

例子
//递归求和

function f(n) {
    if(n==1)return 1;
    return n+f(n-1)
}
let he = f(52)
// console.log(he);

//阶乘
function c(a) {
    if(a==1) return 1;
    return a*c(a-1)
}
let j=c(8)
// console.log(j);


斐波那契数列

image.png


function p(n){
    if(n==1|n==2) return 1;
    return p(n-1)+p(n-2)
}
let p1=p(6)
console.log(p1);