什么是原型、原型链?怎么通过原型继承?

什么是原型、原型链?

总结

原型:实例对象上的私有属性__proto_指向的是构造函数的prototype,简称原型,

原型链:构造函数的原型也有原型,层层往上直到null,形成了链式结构就称作原型链。

当访问一个对象上的某一个属性时,先从对象自身属性中查找,找不到就去它的原型上找,原型上找不到就去原型的原型找,层层往上直到null。

获取原型的方法

1.是通过对象的__proto__获取

2.是通过构造函数的prototype属性拿到原型

3.通过类的prototype属性


1.通过对象的__proto__获取

//  每一个对象都有他的原型对象,他可以使用自己原型对象上的所有属性和方法。
let dog = {
  name: "狗狗"
}
dog.__proto__.eat = function () {
  console.log("啃骨头");
}
dog.eat()

 2.通过构造函数的prototype属性拿到原型

function dog(name, age) { //自定义构造函数
  this.name = name
  this.age = age
}

dog.eat() //直接调用,不能调用

function dog(name, age) { //自定义构造函数
  this.name = name
  this.age = age
}
let dog = new dog("狗狗", 2);
dog.prototype.eat = function () {
  console.log("啃骨头");
}
dog.eat()

 输出2022年8月8日

// 原型对象有什么用
let date = new Date();
console.log(date);
//目标:输出2022年8月8日
Date.prototype.formate = function () {
  let year = this.getFullYear();
  let month = this.getMonth() + 1;
  let date = this.getDate()
  return `${year}年${month}月${date}日`                  
}
console.log(date.formate());

 3、ES6类的prototype属性

//ES6类的基本语法
class Dog {
  constructor(name, age) {
    this.name = name;
    this.age = age
  }
}
Dog.prototype.eat = function () {
  console.log("啃骨头");

}
let dog = new Dog("狗狗", 2);
// console.log(dog.name);
dog.eat()

  扩展面试题:构造函数中的this指向谁?具体用法:this关键字做了什么及使用场景?

  指向new创建的对象

怎么通过原型、原型链做继承?

继承是子类具有父类的各种方法和属性

构造函数继承、原型继承、原型链继承、组合继承、寄生式继承、寄生组合继承

继承的使用场景

//博客系统分为,普通用户,管理员,管理员可以删除用户
class User {
  constructor(username, password) {
    this.username = username
    this.password = password
  }
  login() {
    console.log("登录");
  }
}
目标:实现后台管理管理员的用户
class Admin extends User { //Admin继承 User
  deletePerson() {
    console.log("删除一个人");

  }
}
let admin = new Admin()
admin.login()//登录
admin.deletePerson()//删除一个人

ES5继承 : prototype

原型

function User(username, password) {
  this.username = username
  this.password = password
  this.login = function () {
    console.log("登录");
  }
}
function Admin() {
  this.deletePerson = function () {
    console.log("删除一个人");
  }
}

Admin.prototype = new User();
let admin = new Admin()
admin.login()//登录
admin.deletePerson()//删除一个人

原型链

function User(username, password) {
  this.username = username
  this.password = password
}
function Admin() {
  this.deletePerson = function () {
    console.log("删除一个人");
  }
}
Object.prototype.login = function () {
  console.log("Object原型上的登录方法");
}
Admin.prototype = new User();
let admin = new Admin()
admin.login()//登录
admin.deletePerson()//删除一个人

let a = [1, 23, 4]
a.login()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端-JC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值