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

让你一看就懂,Javascript的原型和原型链

自己的话:

你是否看过很多关于javascript的原型,和原型链的技术文章?但是看完后仍然是一头雾水?

没关系,希望我的这一篇文章,能让你一看就懂。

原型和原型链是JavaScript实现继承和共享属性的重要机制。

每个JavaScript对象都有一个内部属性 [[Prototype]],这个属性指向另一个对象,这个对象被称为“原型”。

比如:

        const Myobj = {
                name: "John",
                age: 30,
                city: "New York"
            };

            console.log(Myobj);

输出结果:

(注意我用红框高亮的部分,分别是

prototype (显示为Object),其包含了 --> 【构造函数constructor】 以及 【__proto__】

当你访问一个对象的属性或方法时,JavaScript首先会查找该对象自身是否具有这个属性或方法。如果没有,它将查找该对象的原型,而原型对象可能也有原型,于是一层一层(通过__proto__作为桥梁),依此类推,直到找到或者到达原型链的末端(通常是 null)

接下来我们详细讲解:

1.prototype

prototype 是一个对象,用于存储构造函数创建的所有实例所共享的属性和方法。

作用:通过 prototype,我们可以给构造函数添加属性和方法,使得所有由该构造函数创建的对象实例都能访问这些属性和方法。并且实现类的继承。

示例

function Father() {
    this.fatherProperty = '我是父类属性';
}
//添加方法
Father.prototype.fatherMethod = function() {
    console.log('我是父类方法');
};

function Child() {
    this.childProperty = '我是子类属性';
}

// 继承父类的属性和方法
Child.prototype = new Father();
Child.prototype.constructor = Child;

const childInstance = new Child();
console.log(childInstance.fatherProperty); // 输出: '我是父类属性'
childInstance.fatherMethod(); // 输出: '我是父类方法'

2. __proto__

每当我们使用构造函数创建一个新对象时,这个新对象会有一个 __proto__ 属性指向构造函数的 prototype 属性

作用:通过 __proto__,我们可以直接访问或修改对象的原型,但是这种做法并不推荐,因为可能会破坏继承链

例如下面的代码,两个对象A和B,原本没有继承关系,但可以通过__proto__让其互相访问属性

const A = {
    eats: true
};

const B = {
    drink: true
};

// 设置 B 的原型为 A
B.__proto__ = A;

console.log(B.eats); // 输出: true,来源于 A
console.log(B.__proto__ === A); // 输出: true

总结:

prototype 与构造函数相关,用于为所有实例提供共享的属性和方法。
__proto__ 与对象实例相关,它指向了构造函数的 prototype,用于访问具体对象的原型。


http://www.kler.cn/news/342689.html

相关文章:

  • 基于PHP的校园二手书交易管理系统
  • 达梦DBLINK访问ORACLE配置方法
  • HE染色:揭示细胞细节,助力病理诊断|文献速递·24-10-11
  • 数据结构与算法——Java实现 33.堆排序
  • 第一个Flutter应用解析(一)
  • React中的refs是什么?
  • 腾讯云SDK地址生成器
  • Django-rest-framework(DRF)怎么实现Excel文件导出
  • Mysql(五) --- 数据库设计
  • 解析一体式IO与分布式IO:从架构到应用
  • NASA:Seasat-A 散射计(SASS)得出的风速和风向矢量数据集
  • MATLAB使用高斯消元法计算方程组的解
  • TikTok Shop美区跨境商家入驻标准大调整,怎么批量采集tiktok达人信息?
  • 获取鸿蒙设备Udid遇到的问题
  • 极狐GitLab X 某轨道交通控制系统龙头企业,助力业务研发敏捷化
  • @Transactional声明式事务回调编程
  • 大数据在金融领域的应用及其未来趋势
  • SpringMVC源码-处理器适配器HandlerAdapter
  • [OS] 4.Linux 内核
  • 开源 AI 智能名片 O2O 商城小程序源码助力企业实现三层式个性化体验