TJR*_*TJR 181 javascript
有没有解决方案来获取对象的函数名称?
function alertClassOrObject (o) {
window.alert(o.objectName); //"myObj" OR "myClass" as a String
}
function myClass () {
this.foo = function () {
alertClassOrObject(this);
}
}
var myObj = new myClass();
myObj.foo();
Run Code Online (Sandbox Code Playgroud)
for (var k in this) {...}
- 没有关于className
或的信息ObjectName
.有可能得到其中一个吗?
Ole*_*kov 315
myObj.constructor.name
Run Code Online (Sandbox Code Playgroud)
返回"myClass".
Edu*_*omo 22
例:
function Foo () { console.log('Foo function'); }
var Bar = function () { console.log('Bar function'); };
var Abc = function Xyz() { console.log('Abc function'); };
var f = new Foo();
var b = new Bar();
var a = new Abc();
console.log('f', f.constructor.name); // -> "Foo"
console.log('b', b.constructor.name); // -> "Function"
console.log('a', a.constructor.name); // -> "Xyz"
Run Code Online (Sandbox Code Playgroud)
如果您使用标准IIFE(例如使用TypeScript)
var Zamboch;
(function (_Zamboch) {
(function (Web) {
(function (Common) {
var App = (function () {
function App() {
}
App.prototype.hello = function () {
console.log('Hello App');
};
return App;
})();
Common.App = App;
})(Web.Common || (Web.Common = {}));
var Common = Web.Common;
})(_Zamboch.Web || (_Zamboch.Web = {}));
var Web = _Zamboch.Web;
})(Zamboch || (Zamboch = {}));
Run Code Online (Sandbox Code Playgroud)
你可以预先注释原型
setupReflection(Zamboch, 'Zamboch', 'Zamboch');
Run Code Online (Sandbox Code Playgroud)
然后使用_fullname和_classname字段.
var app=new Zamboch.Web.Common.App();
console.log(app._fullname);
Run Code Online (Sandbox Code Playgroud)
注释函数在这里:
function setupReflection(ns, fullname, name) {
// I have only classes and namespaces starting with capital letter
if (name[0] >= 'A' && name[0] <= 'Z') {
var type = typeof ns;
if (type == 'object') {
ns._refmark = ns._refmark || 0;
ns._fullname = fullname;
var keys = Object.keys(ns);
if (keys.length != ns._refmark) {
// set marker to avoid recusion, just in case
ns._refmark = keys.length;
for (var nested in ns) {
var nestedvalue = ns[nested];
setupReflection(nestedvalue, fullname + '.' + nested, nested);
}
}
} else if (type == 'function' && ns.prototype) {
ns._fullname = fullname;
ns._classname = name;
ns.prototype._fullname = fullname;
ns.prototype._classname = name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于已经回答了这个问题,我只想指出在 JavaScript 中获取对象构造函数的方法的差异。构造函数和实际对象/类名称之间存在差异。如果以下内容增加了您决定的复杂性,那么您可能正在寻找instanceof
. 或者也许你应该问自己“我为什么要这样做?这真的是我想要解决的问题吗?”
笔记:
在obj.constructor.name
不提供旧的浏览器。匹配(\w+)
应该满足 ES6 风格的类。
代码:
var what = function(obj) {
return obj.toString().match(/ (\w+)/)[1];
};
var p;
// Normal obj with constructor.
function Entity() {}
p = new Entity();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));
// Obj with prototype overriden.
function Player() { console.warn('Player constructor called.'); }
Player.prototype = new Entity();
p = new Player();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));
// Obj with constructor property overriden.
function OtherPlayer() { console.warn('OtherPlayer constructor called.'); }
OtherPlayer.constructor = new Player();
p = new OtherPlayer();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));
// Anonymous function obj.
p = new Function("");
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));
// No constructor here.
p = {};
console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p));
// ES6 class.
class NPC {
constructor() {
}
}
p = new NPC();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));
// ES6 class extended
class Boss extends NPC {
constructor() {
super();
}
}
p = new Boss();
console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p));
Run Code Online (Sandbox Code Playgroud)
结果:
代码:https : //jsbin.com/wikiji/edit?js,console