js_class

本文对比了传统构造函数与ES6类语法在实现继承上的差异,深入探讨了super关键字及__proto__属性的作用,帮助读者理解JavaScript类的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class

首先先写一个简单的class看看

class a{
    constructor(name){
        this.name = name
    }
    sayname(){
        console.log(this.name)
    }
}

class b extends a{
    constructor(name,age){
        super(name)
        this.age = age
    }
    sayage(){
        console.log(this.age)
    }
}
let B = new b();
console.dir(B)

如果是以前我是这么写的

//father构造函数
function father(name,work){
    this.name = name
    this.work = work
    this.tag = 'father'
}
//添加静态方法
father.SB = function(){console.log('SB')}
//在原型上添加公共方法
father.prototype.dowork = function(){
    console.log(`开始${this.work}挣钱吧`);
}
//son构造函数
function son(name,work){
    father.call(this,name,work)
    this.tag = 'son'
}
//将son的隐士原型指向father构造函数
son.__proto__ = father
//将son的显示原型对象中的隐士原型指向father的显示原型对象上
son.prototype.__proto__ = father.prototype;
//为son添加公共方法
son.prototype.sonfun = function(){
    console.log(this.tag)
}
//观察对象
console.dir(father)
console.dir(son)
console.dir(son.prototype.__proto__.constructor.name)

然后看一下b类的实例对象B的内部结构。经梳理得如图:

在这里插入图片描述
extends 从图中可以看出来,class实现继承的方式是把子类的__proto__指向父类,和将子类的prototype中的__proto__指向父类的prototype。

  • super 从功能上可以调用父类的构造方法和父类的方法,具体怎么实现的还不太清楚。

好奇

在这里插入图片描述
很好奇__proto__:后面的值怎么来的
猜测是当前__proto__对象.__proto__.constructor.name。除了顶层的class对象的显示原型对象的__proto__对象.__proto__==null ,所以直接调用显示原型对象的__proto__对象.constructor.name。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值