Javascript对象工厂方法,将参数object作为参数传递
Javascript object factory method that passes arguments object as parameters
下面的代码不能正常工作(jsFiddle):
function makeFoo(a, b) {
var foo = new Foo();
Foo.apply(foo, arguments);
return foo;
}
var Foo = function(a, b) {
console.log(
"This should be called once. "+
"a='"" + a + "'", " +
"b='"" + b + "'", "
);
this.a = a;
this.b = b;
}
Foo.prototype.go = function() {
console.log("a: " + this.a);
console.log("b: " + this.b);
};
var foo = makeFoo("Hello", "World");
foo.go();
期望输出:
应该调用一次。="Hello",b ="世界"
你好
b:世界
实际输出:
应该调用一次。="定义",b ="定义"
这应该被调用一次。="Hello",b ="世界"
你好
b:世界
这是因为您两次调用Foo
:通过new
和通过函数调用。
我认为对于new Foo()
,您只想创建一个继承Foo.prototype
的对象。要实现这一点,请使用Object.create(Foo.prototype)
。
function makeFoo(a, b) {
var foo = Object.create(Foo.prototype);
var result = Foo.apply(foo, arguments);
return Object(result) === result ? result : foo;
}
var Foo = function(a, b) {
console.log(
"This should be called once. "+
"a='"" + a + "'", " +
"b='"" + b + "'", "
);
this.a = a;
this.b = b;
}
Foo.prototype.go = function() {
console.log("a: " + this.a);
console.log("b: " + this.b);
};
var foo = makeFoo("Hello", "World");
foo.go();
但这只是一个技巧,您需要在ECMAScript 5中使用它,因为没有办法用任意数量的参数实例化构造函数。
构造函数应该被实例化,而不是作为函数调用。在ECMAScript 6中,您可以使用Reflect.construct
。
function makeFoo(a, b) {
return Reflect.construct(Foo, arguments);
}
var Foo = function(a, b) {
console.log(
"This should be called once. "+
"a='"" + a + "'", " +
"b='"" + b + "'", "
);
this.a = a;
this.b = b;
}
Foo.prototype.go = function() {
console.log("a: " + this.a);
console.log("b: " + this.b);
};
var foo = makeFoo("Hello", "World");
foo.go();
试试这个:
function makeFoo(a, b){
var foo = new Foo(a,b);
return foo;
}
相关文章:
- 函数未将值作为参数传递
- 如何将参数传递到angularJs中的工厂
- 如何在HTML元素上创建函数,而不是将元素作为参数传递
- JavaScript常量-作为参数传递或直接使用
- 如何将javascript对象作为参数传递到c#web服务中
- 将参数传递给函数
- 如何将Gruntfile.js中的参数传递到webdriverio规范
- javascript,将参数传递给函数内部的闭包中的回调
- Javascript-将包含变量的html字符串作为参数传递
- 将字符串作为参数传递给函数onclick event jquery
- 将修改后的数组作为参数传递给函数
- 在嵌套递归指令中将参数传递给父控制器方法
- each()-将额外的参数传递给回调参数
- 代码气味-将布尔控制参数传递给函数
- 如何将自定义参数传递到FullCalendar事件提要
- 将参数传递给函数,同时保留事件处理程序
- 将图标作为参数传递不会;t工作-谷歌地图
- JavaScript Object Literal“;这个“;关键字jQuery回调参数传递
- Javascript对象工厂方法,将参数object作为参数传递
- 在使用Object时传递参数.创建而不是新建