我试图确定 javascript 中的函数是简单、普通(匿名)函数还是构造函数(具有原型的函数)。到目前为止,我想出了以下功能:
function isPlainFunction(value) {
var own = Object.getOwnPropertyNames(value.prototype),
ctorIndex = own.indexOf('constructor');
if ( ctorIndex !== -1 ) {
own.splice( ctorIndex, 1);
}
if (own.length) {
return false;
}
// walk prototype chain
var proto = Object.getPrototypeOf(value.prototype);
if (proto === Object.prototype) {
return true;
}
return isPlainFunction(proto);
}
我只针对 ES5,(node.js),但我不确定这是否涵盖所有边缘情况,或者我是否仍然没有找到关于这个主题的东西。
我(大致)想到了以下测试用例:
assert.ok( isPlainFunction(function(){}) );
var bar = function(){};
bar.prototype = { get one(){ return 1 } };
assert.equal( isPlainFunction(bar), false );
var foo = function(){};
foo.prototype = Object.create( bar );
assert.equal( isPlainFunction(bar), false );
也就是说,任何具有原型或从非本机类型之一继承原型的函数......