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

Vue基础知识-重要的内置关系:vc实例.__proto__.__proto__ === Vue.prototype

前言

在 JavaScript 中,原型链是实现继承的核心机制,也是理解框架设计(如 Vue)的重要基础。而 Vue 组件(VueComponent)的原型设计,更是直接依赖于 JS 原型链的特性 —— 通过原型链关联,让组件实例(vc)能访问 Vue 原型上的属性和方法。

一、完整源码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/vue.js"></script>
</head>
<body><div id="root"><student></student></div>
</body><script>/*        function Person(){this.name = "张三"}此时Person有自己的原型,其原型的原型(Person.prototype.prototype)是Object的原型(Object.prototype)访问原型方式(两者等价):1 Person实例.__proto__2 Person.prototypePerson.prototype.age = 18 //通过类给原型添加属性let person = new Person()  person.__proto__.sex = '男'//通过对象给原型添加属性console.log(new Person())  //Person对象有自己的属性name和原型属性age、sex对象访问属性时:1 找自身实例是否有该属性;2 找实例的原型是否有该属性(如Person实例.__proto__);3 就继续顺着原型链往上找(如Person实例.__proto__.__proto__,此时为Object的原型)4 Object的原型的原型为null(返回 undefined)。
*/const student = Vue.extend({template:`<div><h1>学生名称:{{name}}</h1><h1>学生年龄:{{age}}</h1></div>`,data() {return {name:'张三',age:'18'}}})const vm = new Vue({el:'#root',data() {return {n:1}},components:{ student}})/* 重要的内置关系:new student().__proto__.__proto__ === Vue.prototype。即VueComponent原型的原型===Vue的原型因此,vc可以访问Vue原型上的属性、方法 */console.log(new student().__proto__.__proto__ === Vue.prototype) // true</script>
</html>

二、核心知识点解析

1. JavaScript 原型链:从 Person 构造函数说起

原型链的核心逻辑是:每个实例对象都有一个__proto__(原型),其__proto__又指向更高层的原型,直到指向Object原型对象.__proto__ = null(原型链终点)

1.1 代码中原型链的关键操作
  • 构造函数与实例的关系new Person()创建的实例,其__proto__ === Person.prototype(这是原型链的起点)。
    let p = new Person();
    console.log(p.__proto__ === Person.prototype); // true
    
  • 两种操作原型的方式
    1. 通过构造函数操作:Person.prototype.age = 18(直接给Person的原型添加age属性);
    2. 通过实例操作:person.__proto__.sex = '男'(实例的__proto__就是Person.prototype,本质和第一种方式一致)。
  • 原型链查找规则:当访问实例的属性时,会优先查找自身属性 → 若没有则找__proto__(构造函数原型)→ 再找__proto__.__proto__(更高层原型)→ 直到null(找不到返回undefined)。
    例如访问new Person().age:实例自身没有age → 找Person.prototype.age(存在,返回 18)。

2. Vue 组件原型关系:为什么 VC 能访问 Vue 原型的方法?

Vue 中的组件(VueComponent,简称VC)是通过Vue.extend创建的构造函数,其原型设计直接依赖 JS 原型链,核心结论是:VC实例.__proto__.__proto__ === Vue.prototype

2.1 代码中验证
console.log(new student().__proto__.__proto__ === Vue.prototype); // true
2.2 这个设计的意义是什么?

Vue 的原型(Vue.prototype)上挂载了很多全局方法(如$emit$on$nextTick等)。通过将VC的原型链指向Vue.prototypeVC实例就能直接访问这些方法,无需重复定义,实现了方法复用。

例如,我们可以在Vue.prototype上添加一个全局方法,然后在组件中直接调用:

// 给Vue原型添加全局方法
Vue.prototype.sayHi = function() {alert('Hi,我是Vue原型上的方法!');
};// 在student组件中调用
const student = Vue.extend({template: `<div><!-- 其他内容 --><button @click="sayHi">调用全局方法</button></div>`,// ...其他配置
});

点击按钮时,VC实例会通过原型链找到Vue.prototype.sayHi,成功执行方法。


文章转载自:

http://kVUERgdj.nqLcj.cn
http://Ts9LWDmo.nqLcj.cn
http://wqI12vKf.nqLcj.cn
http://HCw9Jbkh.nqLcj.cn
http://0moqO49i.nqLcj.cn
http://YeKfxwZV.nqLcj.cn
http://lpOLZ32M.nqLcj.cn
http://ym3aAfmD.nqLcj.cn
http://3EJSSqSf.nqLcj.cn
http://B8Zy7KbF.nqLcj.cn
http://GtwzqR2H.nqLcj.cn
http://1VmxXSts.nqLcj.cn
http://gLdm7liu.nqLcj.cn
http://efN6mn4x.nqLcj.cn
http://Lbh1iEfQ.nqLcj.cn
http://AOnM8Qu2.nqLcj.cn
http://2UY41LcZ.nqLcj.cn
http://r8nxHMK4.nqLcj.cn
http://JWNevbWy.nqLcj.cn
http://rvNaR5Np.nqLcj.cn
http://GQljkeFP.nqLcj.cn
http://sHKrXalN.nqLcj.cn
http://Rw30XW2N.nqLcj.cn
http://qeddZOBq.nqLcj.cn
http://kznOQ6UW.nqLcj.cn
http://4TluqvwC.nqLcj.cn
http://7X3FqZtu.nqLcj.cn
http://FlH0MPuz.nqLcj.cn
http://4KbPONJf.nqLcj.cn
http://Jn3TsNps.nqLcj.cn
http://www.dtcms.com/a/364841.html

相关文章:

  • ESP32嵌入固件读取
  • AI大模型对决:谁是最强智能?
  • MySQL 8.0.40 主从复制完整实验总结(基础搭建 + 进阶延时同步与误操作恢复)
  • [信号与系统个人笔记]第三章 连续时间信号与系统的频域分析 Part 2
  • flutter 中间组件自适应宽度
  • 从在线工具到代码库:图表设计工具挑选指南
  • uniapp 开发上架 iOS App全流程
  • Spring Boot 事务失效的八大原因及解决方案详解
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • Hostol Magento电商服务器套餐:基于阿里云,预配置高性能环境,一键开店
  • CouponHub项目开发记录-基于责任链来进行创建优惠券模板的参数验证
  • Vue+Echarts饼图深度美化指南:打造卓越数据可视化体验
  • 【串口助手】串口调试助手LTSerialTool v3.12.0发布
  • 打靶日记-SQLi-LABS(二)
  • LeetCode 3132.找出与数组相加的整数2
  • 金融行业数智化转型:如何用企业微信AI实现高效内部协作与外部服务?
  • MCP(Model Context Protocol)介绍
  • 【54页PPT】基于DeepSeek的数据治理技术(附下载方式)
  • MySQL安装(如果之前有安装过MySQL,先执行下面的卸载流程)
  • Photoshop - Photoshop 触控手势
  • 网络安全A模块专项练习任务十一解析
  • Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制
  • 02-Media-3-audio.py 音频输入输出,录音、播放、实时回放演示
  • nestjs 阿里云服务端签名
  • Spring boot3.x整合mybatis-plus踩坑记录
  • Ansible 核心配置与任务管理:主机清单、剧本,任务的导入、配置并行
  • Jenkins-Ansible部署discuz论坛
  • 如何利用SMS、RDS把服务从阿里云迁移到华为云
  • 嵌入式高薪岗位有哪些?
  • 惠普HP Color LaserJet Pro MFP M277dw打印有横条维修案例1