Vì điều này đã được trả lời, tôi chỉ muốn chỉ ra sự khác biệt trong cách tiếp cận về việc xây dựng hàm của một đối tượng trong JavaScript. Có một sự khác biệt giữa hàm tạo và tên đối tượng / lớp thực tế. Nếu những điều sau đây làm tăng thêm sự phức tạp cho quyết định của bạn thì có lẽ bạn đang tìm kiếm instanceof. Hoặc có lẽ bạn nên tự hỏi "Tại sao tôi làm điều này? Đây thực sự là những gì tôi đang cố gắng giải quyết?"
Ghi chú:
Các obj.constructor.namekhông có sẵn trên các trình duyệt cũ. Kết hợp (\w+)phải đáp ứng các lớp phong cách ES6.
Mã số:
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));
Kết quả:

Mã: https://jsbin.com/wikiji/edit?js,console