绑定构造函数
Binding a constructor
假设我有一个Javascript类:
function GeneralClass(a, b, c) { ... }
它是这样构造的:
var g = new GeneralClass(a, b, c);
我想创建一个SpecificClass,它与GeneralClass完全相同,但具有绑定值a=1和c=3。
我想这样构造这个类:
var s = new SpecificClass(b);
在其他语言中,有几种方法可以做到这一点:
- 我可以使SpecificClass继承GeneralClass,并让SpecificClass的构造函数用我想要的赋值调用GeneralClass的构造函数
- 我可以在SpecificClass中添加一个GeneralClass字段,并将所有方法调用委托给它
但我正在寻找一种更短、更优雅的方法来用Javascript实现这一点,这种方法将使我能够在运行中创建许多不同的SpecificClass。
您可以创建一个Specific
函数,该函数创建一个带有绑定参数的GeneralClass
。
function GeneralClass(a, b, c) { ... }
function Specific(b) {
var a = 1, c = 3;
return new GeneralClass(a, b, c);
}
var s = Specific(2);
这样的东西怎么样:jsfiddle
function GeneralClass (a, b, c) {
this.a = a;
this.b = b;
this.c = c;
}
GeneralClass.prototype.hello = function () {
console.log("hello");
console.log(this.a);
console.log(this.b);
console.log(this.c);
}
var g = new GeneralClass(1, 2, 3);
g.hello();
function SpecificClass (b) {
this.a = 1;
this.b = b;
this.c = 3;
}
SpecificClass.prototype = new GeneralClass();
SpecificClass.prototype.bye = function () {
console.log("bye");
console.log(this.b);
}
var s = new SpecificClass(22);
s.hello();
s.bye();
好的,我认为上面的解决方案会起作用。然而,有一个问题。每次需要扩展GeneralClass时,都必须创建一个新函数。这是我的建议。它是一个返回函数的函数。它可以接受任意数量的参数,如果其中一些参数为null,则稍后会用传递给新创建的函数的参数替换。
var GeneralClass = function(a, b, c) {
console.log(a, b, c);
}
var GeneralClassExtender = function() {
var defaults = [];
for(var i=0; i<arguments.length; i++) {
defaults.push(arguments[i]);
}
return function() {
var argsToApply = [];
for(var i=0, usedArguments=0; i<defaults.length; i++) {
if(defaults[i] === null) {
argsToApply.push(arguments[usedArguments]);
usedArguments += 1;
} else {
argsToApply.push(defaults[i]);
}
}
return GeneralClass.apply({}, argsToApply);
}
}
var SpecificClass = GeneralClassExtender(1, null, 3);
var AnotherClass = GeneralClassExtender(null, 99, null);
var obj1 = new SpecificClass(10);
var obj2 = new AnotherClass(6, 20);
这个脚本的结果是
1 10 3
6 99 20
这是一把小提琴http://jsfiddle.net/krasimir/bAGVD/3/
相关文章:
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- Jquery:将函数绑定到已绑定元素的点击事件
- 我可以通过使用函数绑定来保留默认值吗?如果没有,为什么
- 这在 Object 方法中不引用对象,而是引用函数绑定到的标记
- 为什么当我尝试将函数绑定到自身时,“this”对象仍然引用窗口
- 如何将函数绑定到使用链接函数创建 HTML 的角度指令
- 将jquery函数绑定到事件
- 将服务中的函数绑定到$scope(错误:无法设置undefined的属性'onChange')
- 使用闭包/函数绑定将自函数作为回调传递
- 如何在 Javascript 中将函数绑定到对象数据成员的更改
- 需要将内部函数绑定到元素的单击事件
- 在Javascript中将对象原型函数绑定到对象
- 将函数绑定到Twitter Bootstrap Modal Ajax Complete
- ng使用一个不识别临时变量形式ng repeat的函数绑定html
- 将函数绑定到baz后调用fn.apply(bar,[])
- 将函数绑定到采用参数的不同事件
- 如何将返回函数绑定到标记角度
- 在IE9中未检测到视图模型函数绑定,但在FF和Chrome中有效
- 如何将函数绑定到ShadowDOM内部的元素
- 当函数绑定在构造函数中时,如何在 ES6 React 中向事件处理程序添加参数