考虑下面的简单代码:
function C1() {
let x=5;
}
var c1=new C1;
alert(c1 instanceof C1); // returns true
function C2() {
let x=5;
return {
getx() { return x; }
}
}
var c2=new C2;
alert(c2 instanceof C2); // returns false ! why ??
问题:
为什么c2不是C2的实例?
如何让一个构造函数返回一个对象(即C2)并且仍然有新的返回该构造函数的实例而不更改C2?
答案 0 :(得分:3)
为什么c2不是C2的实例?
因为C2.prototype
不在c2
的原型链中。 c2
原型链中唯一的对象是Object.prototype
。
如何让一个构造函数返回一个对象(即C2)并且仍然有新的返回该构造函数的实例?
您需要将构造函数的prototype
对象放在对象的原型链中。
E.g。
function C2() {
let x=5;
return Object.create(C2.prototype, {
getx: {value: function() { return x; }},
});
}
这是你在构造函数中使用this
免费获得的,所以你也可以这样做:
function C2() {
let x=5;
this.getx = function() { return x; };
}
无需更改C2
您可以通过Object.setPrototypeOf
更改现有对象的原型(此方法可以取消优化代码)。
function C2() {
let x=5;
return {
getx() { return x; }
}
}
var c2=new C2;
Object.setPrototypeOf(c2, C2.prototype);
答案 1 :(得分:1)
这应该有效:
function C2() {
let x=5;
this.getx = function() {
return x;
};
};
了解当您致电new
时,您创建了一个新对象,此对象将通过该函数中的this
关键字进行引用。
<小时/> 如果你有一个函数返回一个值,你最终只能获得该值。这应该证明:
function C2() {
let x=5;
this.getx = function() {
return x;
};
return new C1;
}
var c2=new C2;
alert(c2 instanceof C1); // returns true
答案 2 :(得分:-1)
你需要使用Class创建一个新对象,你不能创建一个新的函数函数。或者你需要使用原型
class C1 {
constructor(){
this.x=5;
}
}
var c1=new C1();
alert(c1 instanceof C1); // returns true
class C2 {
constructor(){
this.x=5;
}
getx(){
return x;
}
}
var c2=new C2;
alert(c2 instanceof C2); // returns false ! why ??