Vue组件为什么data必须是一个函数呢?本文案例详解

news/2024/7/10 2:31:15 标签: javascript, vue

前言

我们需要先复习下原型链的知识,其实这个问题取决于 js ,而并非是 vue

function Component(){
  this.data = this.data
}
Component.prototype.data = {
    name:'jack',
    age:22,
}
复制代码

首先我们达成一个共识(没有这个共识,请补充下 js 原型链部分的知识):

  • 实例它们构造函数内的this内容是不一样的。
  • Component.prototype ,这类底下的方法或者值,都是所有实例公用的。

解开疑问

基于此,我们来看看这个问题:

function Component(){
 
}
Component.prototype.data = {
    name:'jack',
    age:22,
}
var componentA = new Component();
var componentB = new Component();
componentA.data.age=55;
console.log(componentA,componentB)我是08年出道的高级前端老鸟,有问题或者交流经验可以进我的扣扣裙 519293536 我都会尽力帮大家哦

此时,componentA 和 componentB data之间指向了同一个内存地址,age 都变成了 55, 导致了问题!

接下来很好解释为什么 vue 组件需要 function 了:

function Component(){
 this.data = this.data()
}
Component.prototype.data = function (){
    return {
    name:'jack',
    age:22,
}
}
var componentA = new Component();
var componentB = new Component();
componentA.data.age=55;
console.log(componentA,componentB)
复制代码

此时,componentA 和 componentB data之间相互独立, age 分别是 55 和 22 ,没有问题!

总结

自己突然对这个问题懵逼,不过事后想了想还是自己基础知识忘得太快。以前学习 js 的时候,最基础的:构造函数内和原型之间的区别都模糊了。想不到 vue 这个小问题让我温故而知新了一次。

本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理


http://www.niftyadmin.cn/n/1603442.html

相关文章

如何手 Vue的手势组件呢?本文教你

前言 最近需要使用手指捏合扩大的手势操作,找了几个组件,要么对 Vue 适配不好,要么量级太大,决定自己手写手势操作。 项目与效果预览 思路 直接在 DOM 上绑定 touchstart 、touchmove、touchend 不仅要绑定这几个事件&#xff…

别再写满屏的 get set 了,太 Low,试试 MapStruct 高级玩法

别再写满屏的 get-set 了,太 Low!MapStruct 高级玩法,这篇栈长带你上正道! 1、自定义映射 当我们映射 DTO 的时候,如果某些参数的值 MapStruct 的映射配置不能满足要求,可以使用自定义方法。 新增两个 DTO…

教你如何用24个ES6方法解决实际开发的JS问题?本文详解

本文主要介绍 24 中 es6 方法&#xff0c;这些方法都挺实用的&#xff0c;本本请记好&#xff0c;时不时翻出来看看。 1.如何隐藏所有指定的元素 const hide (el) > Array.from(el).forEach(e > (e.style.display none));// 事例:隐藏页面上所有<img>元素? hi…

为什么start方法才能启动线程,而run不行?

我们都知道&#xff0c;一个线程直接对应了一个Thread对象,在刚开始学习线程的时候我们也知道启动线程是通过start()方法,而并非run()方法。 那这是为什么呢&#xff1f; 如果你熟悉Thread的代码的话,你应该知道在这个类加载的时候会注册一些native方法 一看到native我就想起…

如何用Vue+TypeScript项目配置实战?本文教你

❝ 最近想学习一下TypeScript语法&#xff0c;但是只是看官方文档又有些乏味&#xff0c;还是通过项目在实践中学习比较有趣&#xff0c;所以在这里记录一下我的学习历程&#xff0c;与Vue项目结合开发。&#xff08;官方文档 请戳 >>&#xff09; ❞项目搭建 通过脚手架…

一个简单的字符串,为什么 Redis 要设计的如此特别

Redis中支持的数据类型到 5.0.5 版本&#xff0c;一共有 9 种。分别是&#xff1a; 1、Binary-safe strings(二进制安全字符串)2、Lists(列表)3、Sets(集合)4、Sorted sets(有序集合)5、Hashes(哈希)6、Bit arrays (or simply bitmaps)(位图)7、HyperLogLogs8、 geospatial9、…

Webpack 5模块联邦会不会引发微前端的革命呢? 本文详解

Webpack 5的模块联邦提供加载部分编译好的代码能力&#xff0c;这个似乎会成为微前端架构的标准实现。 Webpack只是我分享的一小点&#xff0c;我是08年出道的高级前端架构师&#xff0c;有问题或者交流经验可以来我的扣扣裙 519293536 我都会尽力帮大家哦 引言 在当前的微前端…

Tomcat 知识点总结,看看你掌握的怎么样?

思维导航&#xff1a; 架构各组件的实现与执行组件实现配置文件Server.xml(重点)ServerServiceExecutorConnectorEngineHostContexttomcat-user.xml(权限管理)Web.xml(不常用)ServletContext 初始化全局参数会话设置安全与优化安全配置安全应用安全传输安全性能优化性能测试To…