当前位置: 首页 > article >正文

前端面经每日一题Day16

原型链

原型链用于实现对象继承和属性查找。

每个对象都有一个与之相关连的原型对象__proto__,这个原型对象本身也有自己的原型对象,以此类推,形成了一个链式结构,原型链。

  1. 属性查找机制:当查找对象的属性时候,如果该实例对象本身不存在该属性,沿着原型链向上查找,直至找到或者找到顶级的对象原型Object.prototype。没找到就是undefined
  2. 属性修改机制:只会修改实例对象本身的属性,如果不存在,添加该属性。如果通过原型链修改属性,会影响所有继承该原型的实例。b.prototype.x = 2

js原型链的顶端是什么?原型链的顶端是对象Object.prototype,它的原型是null。

Object的原型是什么?它的原型是null。Object是一个构造函数,用于创建对象。每个通过 Object 构造函数或对象字面量语法创建的对象都继承自 Object.prototype

let obj={}
//访问对象的原型
console.log(obj.__proto__===Object.protoype) //true
//访问Object.prototype的原型
console.log(Object.prototype.__proto__==null) //true

new做了什么操作?

1.创建一个空对象。用作即将被返回的实例。obj={}

2.设置原型链,空对象的原型赋值给构造函数的原型 Person.prototype=obj.__proto__

3.绑定this并执行构造函数。Person.call(obj) 将构造函数内部this指向空对象。

4.返回添加后的对象。

继承,多态

1继承

允许我们创建一个对象基于另一个对象,从而继承属性和方法。

1.原型链继承

function Animal(name){
    this.name=name
}
Animal.prototype.sayhello=function(){
    console.log('hello',this.name)
}
function Dog(name,age){
    // 1. 借用构造函数继承属性
    Animal.call(this,name)
    this.age=age
}
// 2.设置子类原型为父类的一个实例,实现原型链继承
Dog.prototype=Object.create(Animal.prototype)
// 3.修正修正子类constructor属性的指向
Dog.prototype.constructor=Dog
// 4.设置子类特有方法
Dog.prototype.sayage=function(){
    console.log('my age is,',this.age)
}   
let dog1=new Dog('dog1',23)   
dog1.sayhello()
dog1.sayage() 

2.构造函数继承

function Parent(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

function Child(name, age) {
  Parent.call(this, name); // 调用父类构造函数,实现属性继承
  this.age = age;
}

var child1 = new Child('Alice', 10);
var child2 = new Child('Bob', 12);

child1.colors.push('black');
console.log(child2.colors); // 输出: ['red', 'blue', 'green'](未受影响)

2 多态

同一操作作用于不同的对象上,可以产生不同的执行结果。多态性主要通过方法重写和原型继承来实现。

function Animal(name) {
  this.name = name;
}

Animal.prototype.makeSound = function() {
  console.log('HHHHHHH');
};

function Dog(name) {
  Animal.call(this, name); // 借用构造函数继承属性
}

// Dog继承自Animal,并重写makeSound方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.makeSound = function() {
  console.log('Woof! Woof!');
};
let dog = new Dog('Buddy');
dog.makeSound(); // 输出: Woof! Woof!

// Cat继承自Animal,并重写makeSound方法
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
Cat.prototype.makeSound = function() {
  console.log('Miao Miao!');
};
let cat= new Cat('cuttle');
cat.makeSound(); // 输出: Miao Miao!


http://www.kler.cn/a/444955.html

相关文章:

  • netcore 集成Prometheus
  • aioice里面candidate固定UDP端口测试
  • 【开源项目】数字孪生轨道~经典开源项目数字孪生智慧轨道——开源工程及源码
  • 【论文研读】U-DiTs:在U型扩散Transformer中引入下采样Token,以更低计算成本超越DiT-XL/2
  • 系统思考—战略共识
  • 网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时
  • 华为ensp--BGP路径选择-AS_Path
  • 电力场景输电塔分割数据集labelme格式288张4类别
  • AI 在游戏领域的革命性技术
  • 人工智能 (AI) 模型的数据泄露问题
  • Serverless监控和调试、持续集成和持续部署
  • 小红书关键词搜索采集 | AI改写 | 无水印下载 | 多维表格 | 采集同步飞书
  • MySQL日期类型
  • 如何高效使用 Facebook Business Manager (商务管理平台)
  • AI开发:支持向量机(SVM)鸢尾花模型入门教程- Python 机器学习
  • linux cpu 管理
  • Unity Post请求发送fromdata数据content-type
  • 企业为何需要可视化数据分析系统
  • 迅为RK3576开发板接口丰富4G/5G、wifi6、多网口、NPU等
  • linux 根据名称 杀死linux 上某个jar进程或其他进程
  • rust与python互通
  • honle电源控制器维修UV灯高压电源EVG EPS200
  • 【C语言】一文讲通 和*
  • github快速查找已被删除的文件指令日志
  • Android定时任务实现每隔一段时间切分录音文件,audiorecord实现录音
  • Java全栈项目 - 学生档案管理系统