`
子衿青青
  • 浏览: 110893 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

开发时遇到这样的需求,希望通过一个类似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中...

    详解C# 利用反射根据类名创建类的实例对象

    本文将详细介绍如何利用反射根据类名创建类的实例对象。 一、什么是反射 ---------------- 反射是.NET Framework 中的一个机制,通过反射可以在程序运行时动态地获取程序集的元数据信息,包括类、方法、属性、字段...

    反射创建对象

    本文将深入探讨如何使用反射创建对象,并在反射过程中进行赋值。 首先,我们需要理解Java中的`Class`对象。每个类在运行时都有一个与之关联的`Class`对象,它包含了该类的所有元数据。我们可以通过以下三种方式获取...

    根据名称动态定义类对象

    `type(name, bases, dict)`接受三个参数,分别是类名、基类列表和类字典,其中字典包含了类的属性和方法。 2. 使用`metaclass`:元类是控制类行为的一种方式,通过定义元类,我们可以定制类的创建过程,从而实现...

    C#,利用反射动态创建对象

    创建对象后,我们可以使用MethodInfo和PropertyInfo来动态调用方法和访问属性。 - 调用无参数的方法:`MethodInfo method = myType.GetMethod("MyMethod"); method.Invoke(instance, null);` - 调用带参数的方法...

    在JAVA中创建对象.pdf

    在 Java 中创建对象是面向对象编程语言的核心,类是创建对象的模板,类、对象和接口等构成了 Java 语言不可或缺的概念。创建对象是 Java 编程的基础,掌握对象的声明和实例化是必不可少的。 Java 语言提供了三种...

    Python中动态创建类实例的方法

    3. **实例化对象**:最后,可以直接调用类的构造方法来创建对象实例。 #### 示例代码详解 以下是一个具体的示例,展示了如何动态地创建并实例化类。 ```python def create_instance(module_name, class_name, *...

    9.java学习第九章——对象的创建和使用+构造方法+方法重载——作业的形式:创建对象在JVM中的存储状态(内存图).pdf

    - 在Java中,**创建对象**是使用类的模板来实例化一个具体的实例的过程。 - **创建对象**通常通过`new`关键字实现,例如: ```java Student student = new Student(); ``` - **对象**在内存中的存储状态分为两个...

    c# 以类名为参创建父类相同的类的实例代码

    在C#编程中,有时我们需要根据给定的类名动态地创建对象,特别是在处理大量具有相同基类的子类时。这种需求可以通过两种主要的方法来实现:反射和泛型。以下将详细介绍这两种方法。 首先,让我们看看如何使用反射来...

    实验三:Java类与对象

    `Monkey`类中有默认构造方法和带参数的构造方法,后者允许我们在创建对象时立即设置属性值。 接着,我们学习了如何创建和使用对象。在Java中,通过`new`关键字和类的构造方法来创建对象。实验中,我们创建了两个`...

    Java编程中对象的创建与使用以及方法的重构与重载的区别说明

    Java会根据传入的参数类型和数量自动选择合适的方法。 重载的规则包括: - 方法名必须相同。 - 参数列表必须不同(类型、数量或顺序不同)。 示例: ```java public class Example { public void display(int a)...

    java对象创建过程

    一旦类被正确地加载和初始化后,就可以通过以下步骤来创建对象实例: 1. **分配内存**:JVM会在堆内存中为新创建的对象分配内存空间。分配内存时,会考虑对象所需的大小,包括实例变量的空间以及对齐填充等。如果...

    类的设计以及对象的创建实验报告

    分析它们的共性,包括类似的个体都有哪些属性,有什么动作,然后利用类的格式设计出一个完整的C#类,并在另一个只包含有主函数的类中的主函数内定义一个你的类的对象,并用类名=new 类名(参数表)的方式初始化,...

    C#创建、销毁对象和继承

    构造方法是类的一个特殊方法,它的主要任务是在创建对象时初始化成员变量。在C#中,构造方法的名字必须与类名相同,并且没有返回类型,即使是void也不行。例如: ```csharp public class MyClass { public int ...

    java基础——创建对象与内存分布(csdn)————程序.pdf

    6. 通过`new`关键字和构造器创建对象,并通过对象引用访问和修改属性,调用方法。 掌握这些基础知识对于理解Java程序的运行机制至关重要,是进一步学习面向对象编程、类的继承、接口和多态等高级概念的基础。

    Java创建对象的5种方式.java

    通过`Class`类的`newInstance()`方法,我们可以根据类名创建对象。这需要类有一个无参的公共构造器。例如: ```java Class<Person> personClass = Person.class; Person person = personClass.newInstance(); ``...

    在Java中优雅而简洁的创建对象的方法总结

    这种方式常用于不明确具体类名或需要根据配置动态创建对象的场景。 ```java Class<?> clazz = Class.forName("com.example.Person"); Constructor<?> constructor = clazz.getConstructor(String.class, int....

    Java中创建初始化对象.pdf

    2. **创建对象**:创建对象是通过`new`关键字完成的,这将为对象分配内存并调用构造方法来初始化对象。创建对象的语法为: ```java 对象名 = new 类名(); ``` 或者可以直接合二为一: ```java MyClass my...

    P106~117C++类和对象对象特性学习笔记.docx

    1. 括号法(默认调用):直接在类名后使用括号创建对象,如`Person p;`。 2. 显示法:明确指定构造函数,如`Person p = Person(10);`。 3. 隐式转换法:当类对象需要被当作其他类型处理时,会隐式调用拷贝构造函数。...

    7 面向对象和图形用户界面

    南京大学的课件内容强调了面向对象编程和图形用户界面在Python编程中的重要性,同时也提供了一些基本的操作示例,如如何定义一个类、如何创建对象实例、如何使用类属性和实例属性,以及如何定义和使用类的初始化方法...

Global site tag (gtag.js) - Google Analytics