如何根据类名和参数创建对象

[菜鸟]C++创建类对象时(无参)后不加括号与加括号的区别 【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ... 阅读详情

开发时遇到这样的需求,希望通过一个类似factory的机制来创建对象,这个机制接收两个参数,一个是对象所属的类,另一个是参数数组,例如:

 

这里cls是一个类(即javascript函数),args是一个参数数组,例如[arg1, arg2, ....],希望这个函数返回的对象等同于下面代码的效果:

 

容易想到,我们应该用apply方法,因为javascript中构建对象的过程就是执行构造函数的过程。而构造函数与普通函数性质完全一样,只是它会被new关键字自动调用而已。apply方法接收2个对象,第一个是函数运行的上下文对象,即this对象。在这里对象尚未构建,因此我们使用一个空对象:

 

 

为验证可行性,我们创建1个类:

 

下面用getObject创建一个employee对象并确认其属性:

 

可以看到,正如我们所希望的,对象被正确创建。

 

但事情到此并没有完。问题出在apply函数的第一个参数上:我们用了一个空对象。实际上起始对象不一定为空。当empoyee的prototype也被定义时,就不为空了,例如,我们通过prototype为employee增加一个方法:

 

 

再创建对象,并调用show方法:

 

会出错,说show方法不存在,其原因就是我们只用到了emp的构造函数,却没用到其prototype。

 

实际上,根据javascript规范,new一个对象时,首先是以函数的prototype对象作为原型,在这个基础上去调用创建新对象。因此我们需要修改getObject方法,让apply以prototype为基础。

 

但同时,不能直接以employee.prototype作为apply的第一个参数,因为那是直接修改了empoyee的原型。我们需要创建一份prototype的拷贝。如果用过dojo.delegate方法,我们应该知道复制对象最高效的做法,用其思路,来重写getObject方法:

 

 

 

 

可以看到,show方法也被正确构建。这说明得到了正确的getObject方法。完整的例子可参见:

http://jsfiddle.net/V94Z2/

 

虽然这个需求的实现看似简单,实际上它要求熟知javascript new关键字的工作原理,知其原理,我们就能成功的把对象的构建分成2个部分,一部分是prototype的复制,另一部分是构造函数的执行。用自己的代码去实现这两部分,就能实现我们需要的功能了。

 

 

 

 

 

Qt思岚激光雷达 Qt关于思岚激光雷达研究示例,本示例采用qt界面开发,可以串口也可以tcp进行设备连接。接收数据进行相关的数据进行绘图, 这种雷达可以用于大屏触摸场景,会场互动触摸场景开发。 #ifndef MAINWIDGET_H #define MAINWIDGET_H #include <QTimer> #include <QWidget> #include "lidarmgr.h" namespace Ui { class MainWidget; } class MainWidget. 阅读详情

相关推荐

【BUAA】【计组】计算机组成 pre (含详细解析)

BUAA 计算机组成 本文章旨在为@走肖暂时无法接通的系列文章创造一个目录,收藏本文章,方便查阅! 1. 入门测试 2. 基础知识 3. Logisim   欢迎来到 Logisim 的世界   Logisim 门电路   Logisim 组合电路   Logisim 时序电路   Logisim 仿真与调试   应用与挑战 4. Verilog 与仿真工具   前言   ISE 入门   VCS 入门   Verilog 语法   Verilog 题目实例与分析   Verilog 工程的设计开发调试

Schrodinger007的博客 9809

Java反射与泛型:根据传进来的参数类型,创建实例对象

现有几个类,构造函数的参数都是一样的,就是创建的实例对象不一样。具体如下: class StringFunction{ String id; public StringFunction(){} public StringFunction(String id){ this.id=id; System.out.println("创建了StringFunction实例"); } public String getId() {

W 5362

基于CNN的表情识别(FER)pytorch实现

Report for FER Jian Tang Abstract 我们使用卷积神经网络(CNN)实现了baby的面部表情识别(FER)。 数据上,我们获取了开源FER数据集FER2013[1],besides我们使用爬虫获取了baby相关的人脸图片,进行了手工分类标注以形成一个全新的baby FER数据集。 模型上,我们首先复现了Luan[2]的工作,即参考Kuo[3]在CVPR 2018上的工作并实现一个轻量的CNN网络,在FER2013上进行训练并得到了XXXX%的平均分类准确率(avg a

qq_20241587的博客 3683

C++框架技术-根据类名动态创建类对象

介绍了较为通用的C++支持动态创建类的实现方法,包含核心原理、代码实现

xiaoqiang321的专栏 3908

单片机课程设计——交通灯

单片机课程设计——交通灯一、课程设计主要内容1.1 题目1.2摘要1.3关键词二、设计要求三、设计方案四、参考电路设计4.1.1数码管的设计4.1.2对应程序4.2.1独立按键的设计4.2.2对应程序4.2.3 使用逻辑4.3.1LED模块的设置4.3.2 LED实物图4.3.3 LED显示程序五、调试要点5.1 单片机最小系统5.2 数码管模块5.3 LED模块5.4 独立按键六、总结七、成品图完整程序 一、课程设计主要内容 1.1 题目 交通灯设计 1.2摘要 近年来,随着我国国民经济的快速发展,我国机

PKPROTEUS的博客 3万+

虚幻引擎5 AR开发教程02:构建和测试AR Android App

在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用。

mopanchun的博客 2650

java根据类名创建对象_java反射之根据全类名创建对象

现在的需求是根据类的全名。来创建对象package 中介者设计模式;import java.util.Date;public class CreateObject {public static void main(String[] args) {Object obj = createInstance("java.util.Date");System.out.println(obj);Date d ...

weixin_39633807的博客 6012

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 375

如何通过类来创建一个对象

如何通过类创建一个对象

qq_36148879的博客 1164

领域知识图谱构建的技术流程

因此概念的属性定义十分重要,通常大部分知识库中的概念属性都是采用人工定义等方式生成的,通用知识图谱则可以从开放数据集中获取概念的属性,然后从在线百科中学习实体的属性,并对实体属性进行往上规约从而生成概念的属性。由于百科的分类体系都是经过了百科管理员或是高级编辑人员的校验,其分类系统中的数据可靠性非常高,因此从百科中抽取概念和实体,通常将标题作为实体的候选,而将百科中的分类系统直接作为概念的候选。为了对知识进行合理的组织,更好地描述知识本身与知识之间的关联,需要对知识图谱的模式进行良好的定义。

weixin_43961909的博客 334

5GS 协议栈 — PFCP 协议 — URR 用量上报规则

目录 文章目录目录URR 用量上报规则UEE 的参数Usage Report 的参数示例 URR 用量上报规则 29244 5.2.2 Usage Reporting Rule URR 的作用? 用来告诉 UPF 如何对 PDR 识别的 SDF 或 Application 业务进行使用量统计信息的上报。CP 收到 Report Information 后,可用于计费或者管控(e.g. 超量限速)等用途。 URR 在哪个流程里下发的? N4 会话建立流程。 N4 会话修改流程。 URR 是怎么工作

烟云的计算 4591

3.4 Java的构造方法全解(定义构造方法、方法的重载)

在Java中,构造方法是一种特殊的方法,用于在创建对象时初始化对象。构造方法具有以下特点:构造方法的名称必须与类名完全相同。构造方法没有返回类型,连void都没有。可以有参数,参数可以有默认值。可以重载,即一个类可以有多个构造方法,只要它们的参数列表不同。// 成员变量// 构造方法1:无参数构造方法// 构造方法2:带一个参数的构造方法// 构造方法3:带两个参数的构造方法// 成员变量的getter和setter方法return age;

Argonaut_的博客 1301

【EDA Tools】Spyglass 检查 Verilog 和 SystemVerilog 混合语言及 Lint 检查

Spyglass可以用于检查混合设计中的语言互操作性和一致性问题。对于设计中包含多种硬件描述语言的情况,Spyglass 能够识别并解析其中的模块及其互连,并对其进行验证。例如,在包含 Verilog 和 VHDL 的混合设计中,Spyglass 会自动识别并解析 Verilog 和 VHDL 文件及其相互连接。通过运行 Spyglass Lint 功能,可以检查混合设计中的语言一致性问题,例如不兼容的数据类型、互操作性问题以及其他可能导致设计故障或不一致的问题。

记录学习历程 5080

反射的简单使用

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 当然,平时我们在项目中使用的几率比较小,一般是用在框架上的,从而使扩展性更强。下面我们就简单写...

豌豆的专栏 165

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

反射工具类 java_Java反射工具类

Java的反射无疑会让你的代码更加灵活,设计更加多变,耦合性更低,能够写出更漂亮的代码。废话不多说,直接贴出个人写的工具类,应该比较实用。package com.xxx.utility.code;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.la...

weixin_35820008的博客 645

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# Activator.CreateInstance

Activator 类   包含用于在本地创建对象类型的方法。 无法继承此类。   简单说 Activator.CreateInstance :使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。   使用Activator.CreateInstance 的实际作用是什么呢?   是因为 想创建一个方法 方法中传入一个类的名称 然后就能返回一个这个类的实例 ,这样的做法让程序有更高...

696

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OOP构造方法

1.为什么用构造方法? (1) 因为我们想创建对象的同时,也给属性赋值。实现初始化操作 (2) 例如:Student stu=new Student(“小明”,18); 2. 什么是构造方法? (1) 对象的创建就是通过构造方法来完成。构造方法是一种特殊的方法。 (2) 它的名称和类名相同,没有返回值类型。 (3) 例如:有一个学生类:Student。那么该类默认的无参构造方法就是: 3.构造方法的特点 (1) 和类名相同 (2) 没有返回值类型,也不写void 4. 自定义构造方法 (1) 在创建对象时

weixin_49833114的博客 779

java定义方法_Java构造方法

构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。Java 构造方法有以下特点:方法名必须与类名相同可以有 0 个、1 个或多个参数没有任何返回值,包括 void默认返回类型就是对象类型本身只能与 new 运算符结合使用值得注意的是,如果为构造方法定义了返回值类型或使用 voi...

weixin_29009339的博客 449

构造器(Java)

构造器的主要作用:用来初始化对象的值 需要注意: 构造方法名必须与类名一致 构造方法没有返回值(包括void也没有) 不能被static、final、synchronized、abstract、native修饰 构造方法不能被子类继承 每个类的构造方法数量不限 构造方法根据是否需要传入参数可以分为 有参构造 和 无参构造 如果自己没有编写构造方法,编译器会自动创建无参构造 例如: public class Person{ String name; int age; .

Dogcole的博客 199

第8讲:构造器与构造器的重载

1、构造器的作用 不是为了创建对象,调用构造器的目的是给属性赋值 2、构造器的格式 修饰符 构造器名称(){ 属性的赋值 } 3、构造器与方法的比较 构造器没有方法的返回值类型 构造器里面不能有返回值 构造器的名字必须跟类名一样 举列 public class Person { int age;//属性 int weight; public Person(){//构造器 age=22; weight=176; } pu.

the_Milky的博客 204

简单工厂,工厂方法模式

简单工厂模式:又称为静态工厂方法模式。 在简单工厂模式中,可以根据参数的不同返回不同类的实例。 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 例如 <script> class work{ go(name){ return "今天坐"+name+"去上班" ...

weixin_30323961的博客 76

java构造器

java构造器

xia_huaxian的博客 213

类的构造方法

构造方法 类中的特殊方法,主要用于创建对象 特点: 名称与类名完全相同 没有返回值类型 创建对象时,调用构造方法,不可通过句点调用。 注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法 对象在创建的过程中: 开辟空间并为属性赋予默认值 执行构造方法的代码 将对象的地址赋值给变量 构造方法重载 构造方法可以重载。遵循重载规则。创建对象时,根据传入参数,匹配对应的构造方法即可。 注意,在类中,如果没有显示定义构造方法,则编译器默认提供无参构造方法。 如果已手动添加有参构造方法,则无参构造

woleigequ_ooi的博客 520
上一篇: Dojo Mobile:iPhone/Android的Web应用开发利器
下一篇: Dojo面向对象机制深入剖析
dojotoolkit
博客等级 码龄16年 1205粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值