gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 20:11:42 25 4
gpt4 key购买 nike

我有一个在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com