Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取最新信息';类名';类/原型继承之后_Javascript_Inheritance_Constructor - Fatal编程技术网

Javascript 获取最新信息';类名';类/原型继承之后

Javascript 获取最新信息';类名';类/原型继承之后,javascript,inheritance,constructor,Javascript,Inheritance,Constructor,我玩了一点类/函数/原型继承,得到了一个不错的设置。一些我能理解的简单的事情 出于调试目的,我想在每个构造函数中打印调用该构造函数的对象的类型。例如,Ronin构造函数调用Ninja构造函数,Ninja构造函数调用Person构造函数。为此,我制作了一个get_class函数: function get_class(obj) { var C = String(obj.__proto__.constructor); return C.match(/function (\w+)\(

我玩了一点类/函数/原型继承,得到了一个不错的设置。一些我能理解的简单的事情

出于调试目的,我想在每个构造函数中打印调用该构造函数的对象的类型。例如,Ronin构造函数调用Ninja构造函数,Ninja构造函数调用Person构造函数。为此,我制作了一个
get_class
函数:

function get_class(obj) {
    var C = String(obj.__proto__.constructor);
    return C.match(/function (\w+)\(/, C)[1];
}
这是行不通的。它总是返回“Person”。为什么?每个“类”都有自己的构造函数,不是吗?如果我在每个构造函数中执行
console.log(this)
,Chrome Devtools就会知道对象是哪种类型。我怎么去那里(香草JS)

PS.我的Chrome中的完整输出:


或者你可以做一些真正有效的事情

function getClass(obj) {
    return obj.__proto__.constructor.name;
}
attr(“类”)仅在方法attr存在时有效,而在本机环境中则不会

不过你的建议在设计上还是很好的


请注意,如果类不是本机类,例如数组、字符串、RegExp、Error等,proto.constructor.name将始终返回“Object”。。。如果有人知道如何说服“name”属性返回真实姓名,即使我必须添加代码,我也会为他/她买一根香蕉,因为他/她的麻烦。

我认为问题在于下面这句话。this.prototype.constructor指向Person.prototype指向的对象

this.prototype = Object.create(sup.prototype);
您可能需要显式更改其引用

this.prototype.constructor = this;

类似的问题可以在

中找到,如果
obj.\uuuu proto\uuuu.constructor
总是返回
Person
构造函数,那么
obj.\uuu proto\uuuuu.constructor.name
总是返回“Person”。。。这和我试过的方法完全一样,但事实并非如此。如果它对您有效,您能否在中实施它?感谢动态加载脚本(例如使用require.js)时Doesn不起作用错误消息:this.\uuuu proto\uuuu.constructor.name不是一个函数。要使此答案更“正确”,可以用
对象.getPrototypeOf(obj)
替换
obj.\uu proto\uuu
。请注意:当您的代码为生产而缩小时,基于此的逻辑可能会中断。在开发过程中,当值为“MyClassName”时,可以在缩小时将其简单地截断为“e”。的可能重复项