什么是原型、原型链?
总结
原型:实例对象上的私有属性__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()