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 foo=makeFoo(“你好”,“世界”); foo.go()代码>请尝试以下操作: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
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
操作符所做的操作。