【问题标题】:Get current 'class name' after class/prototype inheritance在类/原型继承后获取当前的“类名”
【发布时间】:2012-07-13 21:50:07
【问题描述】:

我在玩类/函数/原型继承,并获得了不错的设置。我理解的一些简单的事情。

http://jsfiddle.net/rudiedirkx/rwPeD/6/

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

function get_class(obj) {
    var C = String(obj.__proto__.constructor);
    return C.match(/function (\w+)\(/, C)[1];
}

这是行不通的。它总是返回“人”。为什么?每个“类”都有自己的构造函数,不是吗?如果我在每个构造函数中执行console.log(this),Chrome Devtools 就会知道该对象是哪种类型。我如何到达那里(使用香草 JS)?

附言。我的 Chrome 中的完整输出:

【问题讨论】:

标签: javascript inheritance constructor


【解决方案1】:

我认为问题出在下面一行。 this.prototype.constructor 指向 Person.prototype 指向的对象。

this.prototype = Object.create(sup.prototype);

您可能需要明确更改其引用。

this.prototype.constructor = this;

类似的问题可以在Get name of derived constructor in Javascript找到

【讨论】:

    【解决方案2】:

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

    function getClass(obj) {
        return obj.__proto__.constructor.name;
    }
    

    obj.attr("class") 仅在方法 attr 存在时才有效,并且它不会在本机环境中。

    你的建议在设计上还是很不错的。

    请注意 proto.constructor.name 如果类不是原生类,如 Array、String、RegExp、Error 等,将始终返回“Object”...如果有人知道如何说服“name”属性返回真实姓名,即使我必须添加代码来做到这一点,我也会给他/她买一根香蕉。

    【讨论】:

    • 如果obj.__proto__.constructor 总是返回Person 构造函数,那么obj.__proto__.constructor.name 也将总是返回“Person”...这是我尝试过的完全相同的方法,但不是这样。如果它对您有用,您可以在 jsfiddle.net/rudiedirkx/rwPeD/6 中实现它吗?谢谢
    • 在动态加载脚本时不起作用(例如使用 require.js)
    • 错误信息:this.__proto__.constructor.name 不是函数
    • 为了使这个答案更“正确”,您可以将obj.__proto__ 替换为Object.getPrototypeOf(obj)。见stackoverflow.com/a/22667193/1186756
    • 注意:当你的代码被压缩到生产环境时,基于此的逻辑可能会中断。开发过程中值为“MyClassName”时,缩小时可以简单截断为“e”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2021-07-02
    相关资源
    最近更新 更多