vue.js数据绑定 ,通过对象的set/get属性

Vue3 为什么选择 Proxy?看完这篇彻底搞懂 JavaScript 代理模式 为什么 Vue3 能精准感知数据变化?为什么对象访问、参数传递甚至对象创建都能被拦截和校验?这一切都离不开 JavaScript 中强大的 Proxy 代理模式。今天通过一个有趣的“商场总管”故事,带你轻松理解 Proxy 的核心原理与实战应用。 阅读详情
	// Vue.js 数据绑定就是通过对象的set/get属性完成的
		// 在vue组件配置对象中声明的数据,会在创建组件对象时,会以set/get属性的方式将数据作为属性添加到组件对象上,在set方法添加了重新渲染组件的代码.所在,每当组件中的数据发生变化,执行set函数,先做属性赋值,然后执行渲染
		var main = document.getElementById("main")
		let template = main.innerHTML
		
		function initData(){
			// 正常的局部变量生命周期,  执行函数创建局部变量->使用局部变量->函数执行结束销毁局部变量
			let num = null
			let str
			
			Object.defineProperty(window, "num", {
				// 外部函数initdata中声明了一个内部函数set,并且在内部函数中使用到了外部函数的局部变量,这个内部函数称之为闭包函数.
				// 闭包特点:1.函数套函数 2.内部函数必须使用外部函数的局部变量
				// 闭包函数中由于使用了使用了外部函数的局部变量,导致外部函数执行完成后局部变量无法得到及时释放,导致内存泄露
				set(v){
					num = v
					// 同步渲染页面
					// 正则表达式
					render()
					
				},
				get(){
					console.log("num属性的get函数被调用了")
					return num
				}
			})
			
			Object.defineProperty(window, "str", {
				// 外部函数initdata中声明了一个内部函数set,并且在内部函数中使用到了外部函数的局部变量,这个内部函数称之为闭包函数.
				// 闭包特点:1.函数套函数 2.内部函数必须使用外部函数的局部变量
				// 闭包函数中由于使用了使用了外部函数的局部变量,导致外部函数执行完成后局部变量无法得到及时释放,导致内存泄露
				set(v){
					str = v
					// 同步渲染页面
					// 正则表达式
					render()
				},
				get(){
					console.log("num属性的get函数被调用了")
					return str
				}
			})
			
			function render(){
				let html = template
				var reg = /{{([a-zA-Z0-9_$]+)}}/g
				var arr
				// 循环查找符合正则的数据
				while (arr = reg.exec(html)){
					console.log(arr)
					// window["num"]
					// 取出window中对应的属性值
					let v = window[arr[1]]
					// 替换对应的属性
					html = html.replace("{{"+arr[1]+"}}", v)
				}
				// html就是替换后的代码
				main.innerHTML = html
			}
		}
		
		initData()
		
		// 设置window的num属性,执行num属性的set函数
		num = 10
		// 访问window的num属性,执行num属性的get函数
		console.log(num)
		str = "hello"
		// num = 20
		
		str = "word"
		
		
		function btnClick(){
			
			str = "你好"
			num = 23333
		}
		
Cadence安装 选择刚刚解压的E盘DVD驱动中的setup.exe文件,安装路径推荐D盘,此处会自己给你新建文件夹,我们无需手动建文件夹。但是,新产品有一些BUG(影响使用流畅性),所以我们要对17.4打补丁,补丁包同样去吴川斌的博客下载。下载阿狸狗破戒大师 我这边下载的是版本V3.2.6,同样在吴川斌的博客下载安装包,链接同上。记录一下安装过程,方便以后安装使用Cadence。破解完成后,建议将这两个软件创建快捷方式到桌面。到这里,我们已经可以正常的使用Cadence了。对光盘映像文件解压后双击,可以在我的电脑看到。 阅读详情

相关推荐

海康视觉平台VisionMaster使用学习笔记(1)

双击图像源设置图像源的属性,像素格式分为Mono8和RDB24分别对应导入的图像是彩色还是黑白。打开相机驱动软件MVS,对连接的相机进行属性上的配置,先对相机的IP进行对应的设置。将自动触发的使能打开,保存配置好的相机属性,默认保存到用户集1中。点击MVS软件中的触发按钮,查看相机是否进行正常的触发拍照。打开VM软件添加一个图像源,选择图像源选项拖出图像源。回到VM软件中将选择相机选项选择到配置好参数的相机。取图方式也可以调整为相机取图,将图像源改为相机。双击相机进行连接后对相机的属性进行配置。

A567852的博客 1万+

vue的$set和$get方法详解

vue的$set和$get学习

m0_72446057的博客 6018

CTransformers: 高效的Python语言模型绑定库

CTransformers是一个为C/C++实现的Transformer模型提供Python绑定的开源库。它基于GGML库构建,旨在为开发者提供一种高效且易用的方式来在Python中使用各种流行的语言模型。支持多种流行的语言模型,如GPT-2、LLaMA、Falcon等提供统一的简单API接口支持GPU加速(CUDA和Metal)与Hugging Face Transformers和LangChain集成支持流式输出和嵌入计算。

helloaiworld的博客 1268

vue双向数据绑定 set 和get

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Do.

m0_68456754的博客 924

手把手教你用ADS优化肖特基二极管检波电路(附RC参数避坑指南)

本文详细介绍了如何使用ADS软件优化肖特基二极管检波电路,包括RC参数设置、常见失真问题分析与解决方案。通过实战案例和参数优化技巧,帮助射频工程师避免设计陷阱,提升电路性能。特别附有RC参数避坑指南,适用于调幅解调、功率检测等应用场景。

m2n3o4p5的博客 198

信息安全与技术——(十一)恶意代码检测与防范技术

恶意代码(Malicious Code )或恶意软件(Malware )主要是指以危害信息的安全等不良意图为目的的程序,它们一般潜伏在受害计算机系统中实施破坏或窃取信息。

m0_63853448的博客 5991

vue计算属性(get和set方法)案例

一.案例代码&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="app"&

hq.zheng的博客 5279

SEW MDX61B 变频器调试说明

可手动自由更改时间和地址,时间一般不更改,IP地址使用网络适配器地址(Network adapter),点击进入即可。进入网络适配器(Network adapter)后,选择适配器建议地址,点击OK,更改IP地址后点击OK。点击加载配置文件(Load a configuration),加载已保存的应用模块配置文件, 或者点击“next”,开始重新配置AMA0801模块。满足安全回路后,控制模式选为寻参模式(Reference mode),选中开始(start),即可将机械零点设置为电气零点。

xdpcxq的专栏 4305

Vue Computed中get 和set的 以及Computed与watch(关于props接收值报错问题)

*

zhangquanming123的博客 1378

图神经网络实战(1)——图神经网络(Graph Neural Networks, GNN)基础

本节全面介绍了图神经网络 (Graph Neural Network, GNN) ,包括其在数据分析和机器学习中的重要性。首先探讨了图作为数据表示的相关概念及其在各个领域的广泛应用;然后深入探讨图学习的重要性,包括不同的应用和技术。最后,重点介绍了 GNN 架构,并对比了它与其他方法之间的原理和性能差异。

盼小辉丶的博客 15万+

RK3588平台开发系列讲解(项目篇)常见模型结构

📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurrent Neural Network,RNN)等。

内核笔记 1758

vue 自动添加 get/set 方法 的时机

data() { return { form: { prop1: '', prop2: [] } } } methods: { getCache() { const temp = JSON.parse(window.localStorage.getItem(id)); ...

sb866的博客 1278

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JavaScript 拦截器的简单了解(分享)

文章目录1. 闭包语法糖2. class/get/set3. 属性拦截器4. 对象代理拦截器 1. 闭包语法糖 // 这种set、get方法可以添加约束 // set必须要有参数,get必须要有返回值 function fn() { let num = 10 return { set num(value) { console.log("num被修改了"); num = value }, get num() { console.log("nu

weixin_60547084的博客 3535

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

组合api---计算属性,computed,计算属性传入函数,计算属性传入对象

组合api---计算属性,computed,计算属性传入函数,计算属性传入对象

imkaifan的博客 926

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

vue双向数据绑定原理

原理 vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。 1、实现一个数据监听器 Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者 2、实现一个指令解析器 Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数 3、实现一个 Watcher,作为连接 Observer 和 Co.

weixin_53571388的博客 224

全网最全前端必问面试题(持续更新中)

在这种模式下,路由的改变会修改浏览器的历史记录,并触发浏览器的页面刷新。总之,vue-loader是一个用于将Vue单文件组件转换为JavaScript模块的Webpack加载器,提供了许多功能和扩展,使得开发Vue应用程序更加方便和高效。5. 页面性能:每个 iframe 都需要加载独立的 HTML、CSS 和 JavaScript,这会增加页面的请求和加载时间,降低页面的性能。6. 交互限制:由于浏览器的安全策略,跨域的 iframe 之间的通信受到限制,无法直接访问和操作对方的内容。

m0_63760882的博客 1474

Vue 55 ,Vue2 和 vue3 中双向数据绑定的原理,JavaScript的 Object.defineProperty 和 ES6的 Proxy 对象代理,使用详细

⭐Object.defineProperty大家都知道,是一个强大且常用的方法,用于定义对象属性,允许我们精确地控制属性的行为,包括读取、写入和删除等操作; Proxy是ES6中一种用于创建代理对象的特殊对象,它允许我们拦截并自定义目标对象的操作,例如属性访问、赋值、函数调用等。Proxy提供了一种机制,可以在目标对象上设置拦截器,从而拦截对目标对象的操作。

AI Agent 全栈架构师(AI + GIS + Backend)& 数字芯片系统架构师(FPGA),NorthCity Smile的博客(NcSmile,博主域名:https://ncmile.blog.youkuaiyun.com) 2381

vuejs 数据绑定原理

Vuejs 使用get和set来实现数据绑定,心血来潮仿了一下,很粗糙,原理大概相同。 use var vm = new V({ el: '#container', template: '<div>{{name}}: {{age}}</div>', data: { name: 'zlx', ...

LX@2019的博客 515

vue 计算属性 get 和set

计算属性是什么:vue文档里是这么说的,模板中绑定太多的逻辑会让模板过重且难以维护。 换句话说,就是可以自己设置值(b值),这个值和data下定义的值(a值)存在某些关系,b的值是基于a的值,通过某些逻辑产生出来的值,b值可以直接拿到template里去用。当a的值发生变化的时候,b的值会跟着变化。就是计算属性中的默认值get。那set又是什么鬼? b的值是基于a的变化而变化的,那么直接修改b

cofecode的博客 4577

对象的get/set用法、利用对象的get/set实现类似vue v-model的双向数据绑定

1.get/set用法 // js对象的getter和setter用法 var obj={ msg:'hello', // 当[读取]对象的属性时,自动调用get关键字对应的方法 get fn(){ return this.msg //通常直接返回属性 }, // 当[设置]对象的属性(obj.msg)时,自动调用set关键字对应的方法 set fn(_msg){//接收属性将要设置的值 this.msg=_msg } } // 以下两种都一样可读取obj的属性msg console.l

* 880

vue中computed 的set 和get方法

直接上图上代码 清晰明了 &lt;div id="demo"&gt; 姓:&lt;input type="text" placeholder="firstName" v-model="firstName" /&gt;&lt;br /&gt; 名:&lt;input type="

zhan_lijian的博客 4626

vue.js——computed中get方法、set方法

众所周知,vue中computed为计算属性,计算属性是一种带有行为的属性,本质上是方法,但是不能调用。 而需要重新渲染时使用methods中的方法会重复调用执行函数,若函数复杂,浏览器性能会降低。使用computed则会缓存计算结果,避免重复计算,从而提高效率。 computed中的get方法可简单理解为取值时调用此方法,而set则为重新赋值时调用。 当不设置get和set方法时可简写,如...

薛增辉的博客 5989

无涯教程-VueJS - Computed属性

无涯教程已经看到了Vue实例和组件的方法。计算属性(Computed Properties)类似于方法,但与方法相比有一些区别,将在本章中讨论。通过一个例子来了解Computed计算属性。

无涯教程 567

vue中关于计算属性computed以及其中get、set的理解

在重学vue后,了解到这个计算属性,理解了一点点,但是又无法想到什么时候能用到 ------------计算属性是基于它们的响应式依赖进行缓存的------------ get是基于其他的数据来获取到computed里定义的那个数据 set是根据computed里定义的那个数据来改变其他的数据 暂时就理解了这些,理解到新的会更改的,下面给个案例,关于全选的 <html...

dk2319193的博客 1067

vue双向数据绑定的原理

有关双向数据绑定的原理 最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来。之后就在网上查找了别人写的博客,学习一下。 下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。 文章链接:vue的双向绑定原理及实现 Mozilla 开发者服务:Object.defineProperty...

境界线上的地平线 3万+

【javascript】实现给所有对象增加get与set操作

背景 上一篇是递归深拷贝,这次这个有点类似,跟vue里给所有对象加get和set一样 思路 递归方式和深拷贝差不多,就是如果值仍然是个对象的话,需要遍历里面的值,然后再进行加getset。另外还有设置值的时候,如果设置的是个对象,那么也拿去递归,把对象的值加上getset 代码 let obj={ name:'yehuozhili', age:{11:23} } funct...

不忘初心,坚定道路! 792
上一篇: 钩子函数,生命周期函数
下一篇: 音乐时间过滤器
TomQue
博客等级 码龄7年 2粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值