javascript - 如何在 javascript 中修复此类定义以支持 instanceof 运算符

标签 javascript prototype

我有一个类定义方法,用于在 javascript 中创建类:

var Class = function() {
    var clazz = null,
    pros = {};
    for (var i = 0; i < arguments.length; i++) {
        var arg = arguments[i];
        if (typeof arg == "function") arg = arg.prototype;
        else {
            arg.init && (clazz = arg.init, delete arg.init)
        }
        for (var p in arg) pros[p] = arg[p];
    }
    clazz.prototype = pros;
    return clazz;
};

var Person = Class({
    init: function(name) {
        this.name = name;
    },
    say:function(){
        console.info(this.name);
    }
});

var Man = Class(Person, {
    init: function(name) {
        Person.apply(this, arguments);
        this.gender = 'man'
    }
});

var m = new Man('kk');
console.info(m instanceof Man);
console.info(m instanceof Person);

但是,它不支持 instanceof 运算符。

有解决办法吗?

最佳答案

您应该跟踪原型(prototype)链以使 instanceof 工作。您当前所做的只是将属性复制到一个对象中,并将其用作返回函数的原型(prototype)。结果,ParentMan 的父级信息丢失了。

您需要设置原型(prototype)而不是复制。 由于您需要修改现有对象来设置其底层原型(prototype),因此需要已弃用的 __proto__ 属性。此处不能使用 Object.create,因为它会返回一个新对象。

编辑:没有__proto__也是可能的,但你需要function F技巧:http://jsfiddle.net/p9pvQ/ .

var clazz = null,
    pros = Object.prototype; // root of chain

for (var i = 0; i < arguments.length; i++) {
    var arg = arguments[i];

    if (typeof arg === "function") {
        arg = arg.prototype;
    } else {
        if(arg.init) {
            clazz = arg.init;
            delete arg.init;
        }
        var o = arg;
        arg = (function() { function F() {}; F.prototype = pros; return new F; })();
        for(var key in o) arg[key] = o[key];
    }

    pros = arg;
}

m 将具有如下原型(prototype)链:

Class.init // m
  gender: "man"
  name: "kk"
  __proto__: F // Man
    __proto__: F // Person
      say: function (){
      __proto__: Object // Object.prototype
        __defineGetter__: function __defineGetter__() { [native code] }
        __defineSetter__: function __defineSetter__() { [native code] }
        ... (Object.prototype functions)

关于javascript - 如何在 javascript 中修复此类定义以支持 instanceof 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9275881/

相关文章:

javascript - 如何调整 CSS/JS 中字体的大小,使其相对于其容器的两侧有一定的边距?

javascript - 如何使用 jQuery 删除 html 表格中选定的行?

javascript - 试图理解 JavaScript 中原型(prototype)的意义

javascript - JS 函数 : prototype overriding vs prototype extension

javascript - 原型(prototype)属性javascript的问题

javascript - 分配给 "this"属性的 javascript 方法与原型(prototype)上定义的方法有什么区别?

javascript - FF 中 Canvas 图像滚动性能

javascript - 为什么 Kendo dataSource.transport.update 方法不向服务器发送数据?

javascript - 从 Javascript 元素列表中检查哪个元素导致事件

javascript - 在函数原型(prototype)中使用 _.extend