Javascript对象工厂方法,该方法将参数对象作为参数传递

Javascript对象工厂方法,该方法将参数对象作为参数传递,javascript,Javascript,以下代码无法按预期工作(): 函数makeFoo(a,b){ var foo=new foo(); Foo.apply(Foo,参数); 返回foo; } var Foo=函数(a,b){ console.log( “这应该叫一次。”+ “a=\”+a+“\”,“+ “b=\”+b+“\” ); 这个a=a; 这个.b=b; } Foo.prototype.go=函数(){ console.log(“a:+this.a”); console.log(“b:+this.b”); }; var f

以下代码无法按预期工作():

函数makeFoo(a,b){ var foo=new foo(); Foo.apply(Foo,参数); 返回foo; } var Foo=函数(a,b){ console.log( “这应该叫一次。”+ “a=\”+a+“\”,“+ “b=\”+b+“\” ); 这个a=a; 这个.b=b; } Foo.prototype.go=函数(){ console.log(“a:+this.a”); console.log(“b:+this.b”); }; var foo=makeFoo(“你好”,“世界”); foo.go()请尝试以下操作:

function makeFoo(a, b){
  var foo = new Foo(a,b);
  return foo;
}
试试这个:

function makeFoo(a, b){
  var foo = new Foo(a,b);
  return foo;
}

这是因为您调用了两次
Foo
:通过
new
和通过函数调用

我认为使用
newfoo()
您只想创建一个从
Foo.prototype
继承的对象。要实现这一点,请改用
Object.create(Foo.prototype)

函数makeFoo(a,b){ var foo=Object.create(foo.prototype); var result=Foo.apply(Foo,参数); 返回对象(result)==result?结果:foo; } var Foo=函数(a,b){ console.log( “这应该叫一次。”+ “a=\”+a+“\”,“+ “b=\”+b+“\” ); 这个a=a; 这个.b=b; } Foo.prototype.go=函数(){ console.log(“a:+this.a”); console.log(“b:+this.b”); }; var foo=makeFoo(“你好”,“世界”);
foo.go()这是因为您调用了
Foo
两次:通过
new
和通过函数调用

我认为使用
newfoo()
您只想创建一个从
Foo.prototype
继承的对象。要实现这一点,请改用
Object.create(Foo.prototype)

函数makeFoo(a,b){ var foo=Object.create(foo.prototype); var result=Foo.apply(Foo,参数); 返回对象(result)==result?结果:foo; } var Foo=函数(a,b){ console.log( “这应该叫一次。”+ “a=\”+a+“\”,“+ “b=\”+b+“\” ); 这个a=a; 这个.b=b; } Foo.prototype.go=函数(){ console.log(“a:+this.a”); console.log(“b:+this.b”); }; var foo=makeFoo(“你好”,“世界”);
foo.go()像这样,点似乎能够传递任意数量的参数。点似乎能够传递任意数量的参数。太棒了,谢谢。为什么第一个片段是黑客?使用构造函数作为函数来实现此结果有什么问题?为什么必须检查
apply()
的结果?@Jodes对返回值的检查是为了处理这样一个事实,即当未通过
new
调用构造函数时,构造函数可能会返回一些原语值。通过
new
调用构造函数将忽略这样的返回值,因此测试确保从“makeFoo”函数返回正确的内容。@Jodes第一个是hack,因为它使用[[Call]]而不是[[Construct]]。正如Pointy所说,我检查构造函数返回的值以模拟
new
操作符的功能。非常好,谢谢。为什么第一个片段是黑客?使用构造函数作为函数来实现此结果有什么问题?为什么必须检查
apply()
的结果?@Jodes对返回值的检查是为了处理这样一个事实,即当未通过
new
调用构造函数时,构造函数可能会返回一些原语值。通过
new
调用构造函数将忽略这样的返回值,因此测试确保从“makeFoo”函数返回正确的内容。@Jodes第一个是hack,因为它使用[[Call]]而不是[[Construct]]。正如Pointy所说,我检查构造函数返回的值,以模拟
new
操作符所做的操作。