admin管理员组文章数量:1221377
function F() {
return function() {
return {};
}
}
var f = new F();
f instanceof F; // returns false
As far as I understand, if I want instanceof
to work, I need to return this
from the constructor. But I want the constructor to return a function, and I cannot assign to this
.
So, is this really impossible or can it be done somehow, for f = new F()
to return a function and still f instanceof F
to return true?
function F() {
return function() {
return {};
}
}
var f = new F();
f instanceof F; // returns false
As far as I understand, if I want instanceof
to work, I need to return this
from the constructor. But I want the constructor to return a function, and I cannot assign to this
.
So, is this really impossible or can it be done somehow, for f = new F()
to return a function and still f instanceof F
to return true?
4 Answers
Reset to default 8function F() {
var r = function() {
return {};
};
r.__proto__ = this.__proto__;
return r;
}
var f = new F();
f instanceof F;
true
f();
Object
Only works in the browsers with __proto__
You could of course make all functions appear to be instanceof F
by setting F.prototype = Function.prototype;
.
Unfortunately it looks as if ECMAScript doesn't allow you to create a function subclass.
You can however do it in Gecko using the deprecated __proto__
property:
function F() {
function f() {
return {};
}
f.__proto__ = F.prototype;
return f;
}
F.prototype.__proto__ = F.__proto__;
To anyone coming across this today, with ES6/2015 there's new syntax you can use to avoid the deprecated __proto__
property; Object.setPrototypeOf
. Note that MDN warns that this is a slow/expensive operation.
function F() {
const f = function() {
return {};
}
Object.setPrototypeOf(f, F.prototype);
return f;
}
var f = new F();
f instanceof F; // returns true
f(); // returns {}
Note also that it gets a little weird if you want to initialize values in the constructor. You need to set them as props on the function you will return, but later additions to the prototype will reference them as 'this'. e.g.
function F() {
const f = function() {
return {};
}
f.favoriteBand = 'The Books';
Object.setPrototypeOf(f, F.prototype);
return f;
}
F.prototype.getFavoriteBand = function(){ return this.favoriteBand; }
var f = new F();
f.getFavoriteBand() // returns 'The Books'
In you your example F is not a constructor it is a function that returns an anonymous constructor which you then call new upon. instanceof works by looking at the prototype chain, so your code doesn't work because you haven't setup up the prototypes correctly.
This page has a good explain of JavaScript Constructors and how to subsclass.
Take a look at the following code and see if it helps.
function F() {
this.whoami = 'F';
this.whatami = 'F';
}
function Sub() {
this.whoami = 'G';
}
Sub.prototype = new F();
function G() {
return new Sub;
}
var f = new G();
console.log(f instanceof F); // returns false
console.log(f.whoami);
console.log(f.whatami);
本文标签: oopCan JavaScript constructor return function and keep inheritanceStack Overflow
版权声明:本文标题:oop - Can JavaScript constructor return function and keep inheritance? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1739261038a2155367.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
f instanceof F
would not be true, since it is not true. – Felix Kling Commented Apr 26, 2012 at 20:44