当javaScript从入门到提高前需要注意的细节:对象部分

Win10插网线显示未识别网络的三种解决方法 本文介绍了三种解决Win10插网线显示未识别网络问题的方法:更新或重启网络设备驱动程序、重置Winsock目录、启用Network Setup Service服务。这些方法都是基于常见的网络问题和解决方案而设计的,适用于大多数Win10用户。如果你遇到了这一问题,可以按照上述步骤进行操作,相信一定能够找到解决问题的方法。需要注意的是,在进行任何操作之前,请务必备份重要数据以防万一。此外,如果你对计算机硬件或软件不熟悉,建议寻求专业人士的帮助以避免造成不必要的损失。 阅读详情

最近看了一个帖子,楼主抱怨说javaScript不是标准的面向对象语言,最多勉强算是基于面向对象的语言。这样的说法也是非常有现实的市场的,主要是基于class的编程语言影响力太大了,C++、java、C#哪个不是名门之后,搞得大家现在一说面向对象就是必须有class关键字了。

面向对象的开发编程只是一种编程的思想,和对编程的指导意见(设计模式更是一种经验的归纳和名称,绝对不是圣经来的)。面向对象的思想主要是建议开发人员注意几个事项:尽可能的实现代码重用(过程性的函数也是代码重用来的),尽可能的为特定的个体设计独特的数据类型,在这个独特的类型中包含了这个类型所有自我完成的运算,但是仅仅将需要调用者关心的数据和函数公开,其他都屏蔽掉。

具体一个语言是怎么实现面向对象的,和面向对象的开发准则并没有具体的约定。由于历史原因,我们大部分的面向对象编程选择了C++风格的静态CLASS方式,所以我们很多人就习惯上了基于CLASS的面向对象编程方式而已。而且CLASS从C++开始到java再到C#,编译器厂商为了讨好开发人员再语法糖上面下了极大的功夫,推陈出新了众多用于描述对象封装,继承,多态应用的关键字,让我们开发效率极大的提高,自然我们也就喜欢上了CLASS的编程,也自然的认可了CLASS作为面向对象开发的标准或代言人。

既然我们开始理解了面向对象的编程不仅仅有基于CLASS的方式,还有其他的各种方式,比如VB是基于IMPLEMENTS的实现方式,而javaScript是基于PROTOTYPE来实现的。

javaScript的特殊在于,其没有类,所有的一切都是实例(这里我特别的用了实例而不是对象,就是担心说都是对象其实是不严谨的),从类型来观察,javaScript提供了6种我们可以访问的基本数据类型:undefined、null、boolean、string、number、object,以下的代码在null的时候有点另人疑惑,其他都蛮正常,原因是在javaScript中null被定义为了Null。

alert(typeof undefined);  
alert(typeof null);  
alert(typeof 123);  
alert(typeof 123.45);  
alert(typeof true);  
alert(typeof false);  
alert(typeof "Hello");  
alert(typeof {});  

说到Null,我们知道在javaScript中还有String、Date、Number、Boolean、Object、Function,在java或C#中,我们可以判断出这些应该是对象,而且是对基本数据类型的隐射,但是在javaScript中,那就完全不同

alert(typeof Number);  
alert(typeof String);  
alert(typeof Date);  
alert(typeof Boolean);  
alert(typeof Function);  
alert(typeof Object);  

以上得到的结果全是function。这点就告诉我们两个基本事实:1 javaScript中只有object是对象数据类型(就这么唯一一个);2 对象和函数直接的确有着非常暧昧的关系。

如果对以上的函数采用new运算符,我们得到的结果是

alert(typeof new Number());  
alert(typeof new String());  
alert(typeof new Date());  
alert(typeof new Boolean());  
alert(typeof new Function());  
alert(typeof new Object());  

我们可以观察到除了Function之外,其他都返回对象。现在我们开始进入主题。

在javaScript中最简单的对象定义就是使用字面量进行定义

var obj = {};  
  
var Poker = {  
    Title: "K",  
    Style: "spade",  
    Value: 13  
};  

上面这段代码,我们可以得到两个对象。要记住在javaScript中,不采用CLASS来抽象对象,所有的一切值都是实例的。我们不需要任何CLASS就可以得到一个对象,使用{}就是声明了一个对象实例。在这样的一个直接对象中所定义的值默认都是公开的,试图采用var在字面量的对象中声明一个私有属性是不可以的。需要说明下,javaScript对象是一个key-value的集合,我们说的属性其实是一个key,正确的将应该是我们在Poker中定义了3个可便利的Key:Title,Style和Value。讲属性那是方便使用C#、Java的程序员了解。 javaScript对面向对象的封装和CLASS的不同,他没有提供public和private等访问修饰符。如果我们使用现代的浏览器,比如IE9,Chrome等支持ECMAScript5 的浏览器,那么我们可以定义不可遍历的key,并且可以为key来定义set和get,并且可以约定一个key只读,好像已经接近CLASS的习惯了,如下是一个demo

var obj = {};  
  
var Poker = {  
    Title: "K",  
    Style: "spade",  
    Value: 13,  
    State: 1  
};  
  
  
Object.defineProperties(  
Poker,  
{  
    "backgroundImg": {  
        value: "images\\common\\hide.png",  
        enumerable: false, //不可以for 遍历  
        writable: false//只读  
    },  
    "forgroundImg": {  
        value: "images\\spade\\K.png",  
        enumerable: false, //不可以for 遍历  
        writable: false//只读  
    },  
    Img: {  
        get: function() {  
            return this.State == 0 ? this.backgroundImg : this.forgroundImg;  
        },  
        enumerable: true  
  
    }  
}  
);  
  
alert(Poker.Img); //images\\spade\\K.png  
  
for (var key in Poker) {  
    alert(key); //backgroundImg 和  forgroundImg无法被遍历到  
}  
  
alert(Poker.backgroundImg); //依然可以访问  
Poker.backgroundImg = "XXX";  
alert(Poker.backgroundImg); //依然是images\\common\\hide.png  

但使用字面量直接定义对象的话,至少还有两个麻烦,1是重用比较麻烦,2是对私有变量的封装还是不给力。虽然说字面量创建的对象也是可以继承的比如

var Poker = {  
    State: 1  
};  
  
var PokerA = {  
    Title: "A",  
    Style: "spade",  
    Value: 14,  
    __proto__: Poker  
};  
  
var Poker10 = {  
    Title: "10",  
    Style: "club",  
    Value: 10,  
    __proto__: Poker  
};  
  
  
alert(PokerA.Title); //A  
alert(PokerA.State); //1  
alert(Poker10.Title); //10  
alert(Poker10.State); //1  
//在IE8-访问  
alert(PokerA.__proto__.State);  
alert(Poker10.__proto__.State);  

因为javaScript中字面量的对象都是实例,我们不管这样的继承是不是比较麻烦或者另类,但至少我们可以认识到,Poker对象(实例是一直存在的)每一个继承者都需要一个Poker的实例空间

Poker.State = 3;  
PokerA.State = 0;  
alert(PokerA.State); //0  
alert(Poker10.State); //3  
alert(Poker.State); //3  

以下的代码更是明确的告诉我们,Poker的实例中this指向的是实际调用方法的子类(当然你承认这个是子类的话)

var Poker = {  
    State: 1,  
    toString: function() {  
        alert(this.Style + this.Title + ":" + this.Value);  
    }  
};  
  
var PokerA = {  
    Title: "A",  
    Style: "spade",  
    Value: 14,  
    __proto__: Poker  
};  
  
var Poker10 = {  
    Title: "10",  
    Style: "club",  
    Value: 10,  
    __proto__: Poker  
};  
  
  
PokerA.toString(); // spadeA: 14  
Poker10.toString(); //club10:10  

同时,我们可以了解到一个继承链的事情是:当一个被调用的key在当前对象没有定义的时候,会顺着继承链向上去找,直到找到第一个key存在为止(object自身的toString在这个demo中被无视了),如果都没有就是undefined了。你可以认为是CLASS中的重写来实现多态吧,我想可以这么说。

一般来讲,我不建议在字面量(我用这个词非常不舒服,我喜欢叫直接对象)用来继承,直接对象最有价值的用法就是作为参数或什么的用一次,简单高效,看的明白。如果要合理的使用内存,灵活的创建对象,那必须用function才比较爽。

var Poker = function(style, title, value, state) {  
    this.Title = title;  
    this.Style = style;  
    this.Value = value;  
    this.State = arguments[3] === undefined ? 0 : state;  
    var backgroundImg = "images\\common\\hide.png";  
    var forgroundImg = "images\\spade\\" + title + ".png";  
    this.Img = (function(x) {  
        return x == 0 ? backgroundImg : forgroundImg;  
    } (this.State));  
    this.toString = function() {  
        return this.Style + this.Title + ":" + this.Value  
    }  
}  
  
var Poker10 = new Poker("spade", "10", "10");  
var PokerA = new Poker("spade", "A", "14", 1);  
  
alert(PokerA.toString()); // spadeA: 14  
alert(Poker10.toString()); //club10:10  
alert(PokerA.Title); //A  
alert(PokerA.State); //1  
alert(Poker10.Title); //10  
alert(Poker10.State); //0  
alert(PokerA.Img); //images\spade\A.png  
alert(Poker10.Img); //images\common\hide.png  

上面的代码显然舒适多了,而且容易理解。我不反对吧Poker这个函数叫构造函数,事实上他也的确帮助我们构造了一个Poker对象,不过由于javaScript没有CLASS的概念,所以我更喜欢倾向于说:Poker函数帮助我们构造了一个以Poker为原型的对象。叫起来非常的绕口,那就还是说是构造函数吧。

无论是直接对象还是函数构造得到的对象,对于javaScript来讲都是动态的,这个实例可以动态的添加key。

看看以下代码,在构造完成了Pkoner10和PokerA之后,我们在Poker的原型上创建了一个新的函数createDom,这个函数依然对Pkoner10和PokerA是有效的。

var Poker10 = new Poker("spade", "10", "10");  
var PokerA = new Poker("spade", "A", "14", 1);  
  
Poker.prototype.createDom = function() {  
    return $("<img id=" + this.Style + this.Title + ">");  
}  
  
  
$(  
function() {  
    PokerA.createDom().appendTo("body");  
    Poker10.createDom().appendTo("body");  
}  
);  

不过你要记得,function新加的key必须加在prototype上,以下代码就是错误的

Poker.insert = function(box, poker) {  
    poker.appentTo(box);  
}  
  
PokerA.insert("body", PokerA.createDom()); //错误了  

原因我估计是这样的,function当函数用的时候就是函数,当用new构造的时候,编译器将this指向的key防止到了function的prototype(原型)上,以下算是一个证明吧

alert(Poker.prototype.constructor === Poker); //true  
alert(PokerA.constructor === Poker); //true  
alert(PokerA.createDom === PokerA.__proto__.createDom); //true  
alert(PokerA.__proto__.constructor === Poker.prototype.constructor); //true

说到key了,正好说下javaScript中的数组,数组一般在静态语言的概念中式连续分配的一段内存,大小是固定的。不过javaScript中的数组我看其实是对象的变形

var arr = [];  
for (var i = 0; i < 5; i++) {  
    arr[i] = i;  
}  
arr.push(99);  
  
for (var index in arr) {  
    alert(index); // 0 1 2 3 4 5  
}  

最后的for得到的不是数组的值,而是数组的index,所以我们可以这样求值

var arr = [];  
for (var i = 0; i < 5; i++) {  
    arr[i] = i;  
}  
arr.push(99);  
  
for (var index in arr) {  
    alert(arr[index]);  
}  

所以,估计arr[i] = i是动态的添加了一个属性,并赋值而已啦。

还是回到构造函数来说,一般看来,为了符合面向对象的一个编程意思:对象是自己的一组数据的集合,所以我们一般在构造函数中定义对象的属性(也就是数据),数据由构造函数的参数提供,而对象的方法在外部用函数编写,并且指向这个构造的原型。原因是在javaScript中字面量的对象没有property……

这个property就是function构造出的实例,如果把方法直接写在function上,那就是这个function的静态成员了,估计可以这么说,一下是一个demo

function Poker(style, title, value) {  
    this.Style = style;  
    this.Title = title;  
    this.Value = value;  
}  
  
Poker.max = function(Poker1, Poker2) {  
    var p;  
    for (var i = 0; i < arguments.length; i++) {  
        if (arguments[i] instanceof Poker) {  
            if (typeof p == "undefined") {  
                p = arguments[i];  
            }  
            else {  
                p = p.Value > arguments[i].Value ? p : arguments[i];  
            }  
        }  
    }  
    return p;  
}  
  
  
var p = Poker.max(new Poker("club", "K", 13),  
            new Poker("diamond", "A", 14),  
            "",  
            new Poker("diamond", "10", 10));  
  
alert(p.Style + p.Title + "[" + p.Value + "]"); // diamondA[14]  

那么函数,构造函数,对象之间的原型关系到底怎么样的呢?下面的代码描述了这些关系

alert(Poker.constructor); //function Function() { [native code] }  
alert(new Poker().constructor); //function Poker(style, title, value) {  
//            this.Style = style;  
//            this.Title = title;  
//            this.Value = value;  
//        }  
alert(Poker.constructor.prototype); //function Empty() {}  
alert(Poker.prototype == new Poker().constructor.prototype); // true  
alert(Poker.constructor.prototype == new Poker().constructor.prototype); // false  
alert(new Poker().propertye); //undefined  

函数的构造函数是Function对象;

函数的对象化(函数创建的对象)的构造函数是function的定义;

函数的构造函数的原型是一个空函数;

函数的原型和函数创建的对象的构造函数的原型相等(所以对象是函数构造出来的);

函数的构造函数的原型和函数的对象化的构造函数的原型不同;

对象没有原型可以直接访问(这个和字面量的对象一样的);

上面的文字看上去和绕口令一样的,但多念念就明白了……

所以证明前面的说法:如果需要函数的成员让实例访问,要么加到函数代码里面,要么在外面加到函数的原型上去

智能车图像处理22-进阶篇14--小s的判断 这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。 阅读详情

相关推荐

51单片机STC8G1K08驱动ws2812记录

使用51单片机控制17个2812灯,这里选择STC8芯片,最大频率可以达到35M,参考网上的各种文章案例,使用定时器做的时候实测做不到规格书要求的245-345ns,STC8G1K08不带PWM,所以只能使用nop来做,好在单片机在这里只有做编程灯的功能,省略测试过程,下面是程序,使用的是24MHz内部晶振 //设置一个灯珠 void SendOnePix(unsigned char *ptr) { unsigned char i,j; unsigned char temp; fo...

的博客 7320

当javaScript从入门到提高前需要注意的细节:变量部分

到了HTML5的时代,对javaScript的要求不是降低了,而是更提高了。javaScript语言的入门非常简单,如果你有java、C#等C风格的结构化语言的基础,那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言,这个特性决定了他在很多方面和java、C#等语言有极大的不同。很多人说只要会java、C#就可以在短时间内搞定javaScript,估计一般都是

shyleoking的专栏 8978

如何使用Qt的PIMPL习惯用法(PIMPL Idiom

PIMPL是指“Pointer to IMPLementation”(指向实现的指针),意味着将实现细节隐藏起来,用户类无需关注这些实现细节。在Qt中常用PIMPL习惯用法来清晰地区分接口与实现,尽管Qt官方文档并未详细说明该机制。本文将演示如何在Qt中使用PIMPL习惯用法,并以一个简单的坐标输入对话框作为实例。

电脑管家 1033

JavaScript 快速入门手册

JavaScript是一门解释型语言,所谓解释型指语言是指不需要被编译为机器码在执行,而是直接浏览器|node中执行。JavaScript中每一个函数对象都存在一个隐藏的对象属性:prototype原型对象函数以普通函数调用,prototype没有任何作用函数以构造函数调用,new 构造函数(...);

慈様 2万+

液冷方式介绍

如果将直径在1~100nm的颗粒悬置在传热流体(例如:水、乙烯、乙二醇等)中时,其传热能力会得到提升,因为大多数固体材料的热导率要大于液体,因此由颗粒、流体组成的混合物热导率也高于液体本身的热导率,由此制成的流体,我们称之为纳米流体。金属冷管的液体工质蒸散量几乎为0,而柔软材质的管道则会产生液体的蒸散,在封闭式循环系统中,为了弥补液体工质的蒸散,必须定期在系统中补充液体工质。——我们之前说过,材料的导电和导热的机制大致是类似的,所以导电能力更强的金属往往具有更好的导热能力。

制冷技术咨询与服务的博客 2034

Win7/Win10双系统兼容指南:Arduino IDE 1.8.19与2.3.2的安装避坑全攻略

本文详细解析了在Win7/Win10双系统环境下安装和配置Arduino IDE 1.8.19与2.3.2版本的完整指南,特别针对ESP32开发环境的深度配置和COM端口常见问题提供了实用解决方案。通过版本对比、安装优化和性能调优,帮助开发者高效搭建稳定的物联网开发环境。

weixin_30500105的博客 186

当javaScript从入门到提高前需要注意的细节:闭包部分

对于希望在javascript技术中提高的人群来说,闭包肯定时常是一个令人感觉神秘的技术。早先有人说javaScript中的闭包可能会引发javaScript内存管理的复杂度,也许会出现内存泄露,所以不建议用闭包。不过jQuery很好的证明了闭包非常好用,C#的Linq也证明的闭包技术的重要性,所以花一点点时间来理解下闭包还是很值得的,再说了,以下的内容不过就是一杯茶的时间而已。先给出一个闭包的定

shyleoking的专栏 6648

别慌!Oracle MOS登录页面大变样?5分钟搞定新旧账号登录全流程

本文详细解析Oracle MOS登录页面改版后的新旧账号登录流程,帮助用户快速适应账号体系变革。针对传统MOS账号和OCI账号的不同应用场景,提供5分钟内完成无缝切换的实用指南,包括登录步骤、书签设置和密码管理策略,助力数据库管理用户高效访问Oracle技术支持资源。

weixin_30275415的博客 517

当javaScript从入门到提高前需要注意的细节:函数部分

在javaScript中,函数是一个很基础的对象,同样也是非常随意,定义起来很随意,用起来那是更加随意。以下说明在javaScript中声明一个函数那是多麽的随意function fun1() {//声明一个函数 } function() { //声明一个匿名函数 } var fun2 = function() {//声明一个变量指向一个匿名的函数表达式 } var fun3 = fu

shyleoking的专栏 4193

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1242

【PCIe 总线及设备入门学习专栏 3.2.2 -- PCIe 中什么是 SR-IOV】

SR-IOV(Single Root I/O Virtualization)是 PCIe 规范中的一种技术,允许物理 PCIe 设备(称为 Physical Function, PF)虚拟化为多个虚拟设备(称为 Virtual Functions, VFs),使多个操作系统或虚拟机能够共享同一个物理设备。SR-IOV:一种 PCIe 虚拟化技术,允许将一个物理 PCIe 设备虚拟化为多个虚拟设备。:物理设备的主要管理接口。:PF 的轻量级副本,分配给虚拟机或操作系统。

CodingCos的博客 1513

JavaScript对象详解,js对象属性的添加

JavaScript对象详解,对象属性

weixin_44992737的博客 2万+

在 ABAP SEGW OData 服务里,把 Function Import 参数长度校验真正跑起来

SAP Gateway服务中Function Import参数长度校验的实现机制解析:在SEGW中定义Max Length参数后,需通过模型特性USE_STRICT_FUNCTION_PARAM_CHK(7.52+版本支持)启用严格检查。该特性需在MPC_EXT的DEFINE方法中设置,框架会在URI解析阶段拦截超长参数,避免错误进入业务逻辑。对于低版本系统,建议在应用层手动添加校验。这种模型驱动的方式符合Clean Core原则,能有效提升接口健壮性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 493

javaScript从入门到提高前需要注意的细节:变量部分

到了HTML5的时代,对javaScript的要求不是降低了,而是更提高了。javaScript语言的入门非常简单,如果你有java、C#等C风格的结构化语言的基础,那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言,这个特性决定了他在很多方面和java、C#等语言有极大的不同。很多人说只要会java、C#就可以在短时间内搞定javaScript,估计一般都是

cvan的小窝 632

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

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

【JavaScript】JS对象和JSON

var perStr='{"属性名":"属性值","属性名":"属性值","属性名":{},"属性名":["","",""],"属性名":[{},{},{}]}'3、创建数组并初始化:new Array("one","two",2) ,可简写: var 数组名=[元素,...]9、数组.splice(start,deleteCount,[添加的元素,...])---删除或删除添加原数组元素。1、数组1.concat(数组2)---返回数组1和数组2合并后的新数组。

想做职场小白吗? 我来教您....... 3167

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

当javaScript从入门到提高前需要注意的细节:变量部分 .

到了HTML5的时代,对javaScript的要求不是降低了,而是更提高了。javaScript语言的入门非常简单,如果你有java、C#等C风格的结构化语言的基础,那javaScript你最多半天就可以写点什么了。但是javaScript是一种动态语言,这个特性决定了他在很多方面和java、C#等语言有极大的不同。很多人说只要会java、C#就可以在短时间内搞定javaScript,估计一般都是

水泽木兰 677

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JavaScript零基础入门 4:javascript对象有哪些

???? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强) ???? 基础推荐:Java基础教程系列 ???? 实战推荐:Spring Boot基础教程 ???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录一、对象1、对象的分类2、创建对象3、属性4、读取对象中的属性5、修改对象的属性值6、删除对象的

学Java,找哪吒 7390

【当javaScript从入门到提高前需要注意的细节:变量部分】 的总结

总结几个觉得重要的部分 1. 在全局段(方法外)初始化的变量都是全局变量。 2. 在方法内初始化的变量,以var声明的为局部变量,不以var声明直接初始化的是全局变量。 3. 一个作用域内,以var声明的变量在该作用域代码开始执行时就已分配好空间,不以var声明的变量只有到执行时才会被分配空间。在未初始化时alert可以发现分别为undefined和提示没有定义 (或者脚本停止执行) 4.

mtawaken的专栏 446

当JavaScript从入门到提高前需要注意的细节:闭包部分

原文链接:点击打开链接 对于希望在javascript技术中提高的人群来说,闭包肯定时常是一个令人感觉神秘的技术。早先有人说javaScript中的闭包可能会引发javaScript内存管理的复杂度,也许会出现内存泄露,所以不建议用闭包。不过jQuery很好的证明了闭包非常好用,C#的Linq也证明的闭包技术的重要性,所以花一点点时间来理解下闭包还是很值得的,再说了,以下的内

hao448609471的专栏 678
上一篇: 10+ powerful debugging tricks with Visual Studio
下一篇: 一个08届毕业的学长写给即将毕业的09届的学弟学妹们
lniwn
博客等级 码龄16年 33粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值