场景
你会收到一个的构造函数ctor,以及一个数组args,对于每个ctor,args长度不定。如何能够通用的构造一个实例呢?
简单而不用思考的方法:
var buildInstance = function(ctor, args) {
if (args.length == 0) {
return new ctor();
}
if (args.length == 1) {
return new ctor(args[0]);
}
if (args.length == 2) {
return new ctor(args[0], args[1]);
}
if (args.length == 3) {
return new ctor(args[0], args[1], args[2]);
}
};
It works.
自己实现“new”
但是聪明而又懒惰的程序员显然不会满足用这种方式写出的代码,它太不时髦了。
我们考虑一下new ctor的时候,程序做了什么?
1、构造了一个新的object对象o
2、使o的原型指向ctor的prototype
3、对o调用了ctor
了解了以上原理之后,我们也可以自己来实现“new”,代码如下:
var projection = function(o) {
var F = function() {};
F.prototype = o;
return new F();
};
var buildInstance = function(ctor, args) {
var proto = projection(ctor.prototype);
ctor.apply(proto, args);
return proto;
};
我们来测试一下
var MockClass = function() {
this.args = arguments;
};
MockClass.prototype.log = function() {
console.log(this.args);
}
var mock1 = buildInstance(MockClass, [1,2]);
mock1.log(); // [1,2]
var mock2 = buildInstance(MockClass, [1,2,3]);
mock2.log(); // [1,2,3]
it works!
利用Function.prototype泛化
作为一个肯动脑筋的程序员,我觉得还能再进一步,这个方法添加到Function.prototype
Function.prototype.buildInstance = function(args) {
var proto = projection(this.prototype);
this.apply(proto, args);
return proto;
};
然后我们就可以这样调用了
var mock1 = MockClass.buildInstance([1,2]);
mock1.log(); // [1,2]
var mock2 = MockClass.buildInstance([1,2,3]);
mock2.log(); // [1,2,3]
太赞了!
分享到:
相关推荐
创建一个子类的对象实例的时候,必先调用父类的无参数的构造函数(默认构造函数),假如父类有带参数的构造函数,那么系统将不会给它创建无参数的构造函数,这时,子类在实例化的时候,因为找不到父类的默认构造函数...
《Visual C++2012入门经典(第6版)》实例,在派生类的构造函数中调用基类的构造函数
举例说明构造函数的调用过程,定义类及其派生类,构造函数对类成员初始化
析构函数也是以类名作为函数名,与构造函数不同的是在函数名前添加一个“~”符号,标识该函数是析构函数。析构函数没有返回值,甚至void类型也不可以,析构函数也没有参数,因此析构函数是不能够重载的。这是析构...
C++构造函数详解及显式调用构造函数.doc
问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...
面向对象程序设计,即C++语言,类。构造函数的显示调用+构造函数的重载,文件里面有详细的注释。
在VS.Net中,有很多种方法动态调用对象的构造函数。一是通过Activator类的CreateInstance()方法。这个方法我们在Remoting中也用过。它实际上是在本地或从远程创建对象类型,或获取对现有远程对象的引用。它的方法...
说明了派生类与基类之间的构造函数的调用顺序……
C# MVC默认的实例化控制器时是调用不带参数的构造函数,但是使用castle注入进行构造注入构造函数带参。
2.建立一个对象数组,内放5个学生的数据(学号、成绩等),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号; 建立静态数据成员,实现平均分计算 3.(1)将下例程序...
C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用
1 . 用同一个类的源对象构造一个目标对象时,会调用拷贝构造函数...3. 当类有一个带有一个参数的构造函数时,可以用这个参数同类型的数据初始化这个对象,默认会调用这个构造函数。 代码如下: #include “stdafx.h”
子类如果有多个构造函数的时候,父类要么没有构造函数, 让编译器自动产生,那么在执行子类构造函数之前先执行编 译器自动产生的父类的缺省构造函数;...式的缺省构造函数可以让子类的构造函数调用。
3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...
C++中的构造函数、析构函数剖析 在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 ...“构造函数”和“析构函数”的调用顺序
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类...而默认构造函数没有参数,它什么也不做
看了些窗体传值的例题都是用构造函数 可我觉得构造函数想实现即时传值好象不行 呵呵,我总是理解不了构造函数(菜吧) 我所以就想了这样个办法来实现传值 using System; using System.Collections.Generic; using ...
主要介绍了C#中派生类调用基类构造函数用法,实例分析了派生类调用基类构造函数的技巧,具有一定参考借鉴价值,需要的朋友可以参考下