手撕Vue-实现计算属性

前言

经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方,这个我们已经撕完了。接下来要实现的是计算属性,计算属性的实现原理是通过 Object.defineProperty() 来实现的,我们先来看看计算属性的使用。

看之前先来改造一下我们的代码基础模板,首先是 example.html 的内容如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue基本模板</title>
    <script src="js/nue.js"></script>
</head>
<body>
<div id="app">
    <p>{{ getName }}</p>
</div>

<script>
    let vue = new Nue({
        el: document.querySelector('#app'),
        data: {
            name: "BNTang"
        },
        computed: {
            getName() {
                return this.name + "- 666";
            }
        }
    });
</script>
</body>
</html>

导入的 Nue.js 是我们之前写的这里不在贴代码,好了,我编写了一个计算属性,用模板语法的方式进行了渲染,页面肯定是显示 undefined 的,因为我们还没有实现计算属性的功能,接下来我们就来实现计算属性的功能。

在实现之前,我们来分析一下计算属性的编写思路, 当我们在 computed 编写了一个计算属性名称,比如 getName,这个时候呢我使用的是模板 {``{}} 进行调用,那么我们去看一下模板的渲染源代码,在其中是可以拿到 getName 的,这个时候我们的 getContent 是从 Nue 中的 data 中去获取的,那我是不是可以在创建 Nue 实例时,将 computed 中的内容也放到 data 中呢?这样的话,我在 getContent 中就可以拿到了,那么我们就来实现一下吧。

将 computed 中的内容放到 data 中,我们可以在 Nue 的构造函数中进行实现,首先将 computed 的内容存储起来,然后在 data 中进行合并,代码如下:

存储 computed 的内容:

javascript 复制代码
this.$computed = options.computed;

将 computed 中的方法添加到 data 中, 只有这样将来我们在渲染的时候才能从 data 中获取到 computed 中定义的计算属性,定义一个 computed2data 方法单独来处理:

javascript 复制代码
computed2data() {
    for (let key in this.$computed) {
        Object.defineProperty(this.$data, key, {
            get: () => {
                return this.$computed[key].call(this);
            }
        });
    }
}

这里我们使用了 Object.defineProperty() 来实现,这里的 get 方法就是我们在模板中调用计算属性时,获取计算属性的值,这里的 this.$computed[key] 就是我们在 computed 中定义的方法,然后我们调用这个方法,这里的 this 是指向 Nue 的实例的,所以我们需要使用 call 来改变 this 的指向,这样我们就可以在模板中调用计算属性了。

好了,我们现在已经将计算属性的内容添加到了 $data 中,那么我们就可以在 getContent 中获取到计算属性的值了,打开浏览器,查看一下效果:

相关推荐
leoZ2313 分钟前
2026-09-08-mysql-57-init-walkthrough
前端·javascript·数据库·vue.js·opencv·mysql·adb
艾伦野鸽ggg9 分钟前
JavaScript 原型链与原型对象详解
javascript·原型模式
qq_3508972116 分钟前
trea实用工具
vue.js·uniapp
paopaokaka_luck19 分钟前
非遗文物数字化系统(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
前端·javascript·vue.js·人工智能·数据分析·echarts
乘风gg23 分钟前
AI Coding 提效 2 倍是真的吗?到底怎么衡量效果
前端·ai编程·claude
用户9210802628624 分钟前
从对象到原型链:理解 this、构造函数和 new
前端
猫不易29 分钟前
Webpack 与 Vite:从 Loader / Plugin 到 Rolldown 统一引擎
前端·vite
YHL41 分钟前
🎯 Danci —— 用 AI 驱动开发一个全栈英语单词学习平台
前端·后端
平头哥~42 分钟前
Day 20 _ 3D 翻卡_perspective 写错人,卡片就穿帮
前端·3d·css3·学习资料
小聪7081 小时前
elpis-core 前端 Webpack 工程化实践
前端