JS的继承
类继承使用 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()
你的姓是王
方法用于调用父类的构造函数。
//父类
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():告诉老默,我想吃鱼
原型链
部分画图解析
函数对象 : 就是平时称的对象;
实例对象 : 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);
斐波那契数列
function p(n){
if(n==1|n==2) return 1;
return p(n-1)+p(n-2)
}
let p1=p(6)
console.log(p1);