8

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

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)?

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

Chrome 开发工具输出

4

2 回答 2

6

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

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

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

你的建议在它的设计上还是很好的。

请注意,如果类不是原生类,例如 Array、String、RegExp、Error 等, proto .constructor.name 将始终返回“Object”...如果有人知道如何说服“name”属性返回真名,就算要加码,我也会给他买根香蕉给他/她的麻烦。

于 2012-07-18T08:03:29.663 回答
0

我认为问题出在以下行。this.prototype.constructor 指向 Person.prototype 指向的内容。

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

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

this.prototype.constructor = this;

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

于 2014-01-01T09:01:28.883 回答