Javascript 当使用函数继承时,“instanceof”的等价物是什么?

Javascript 当使用函数继承时,“instanceof”的等价物是什么?,javascript,inheritance,functional-programming,instanceof,Javascript,Inheritance,Functional Programming,Instanceof,在JavaScript中,有一种实现继承的模式,称为“函数继承”,如Crockfords“JavaScript:好的部分”第5章所述 与使用伪经典模式相比,该模式的一个缺点是我们无法使用instanceof操作符来区分类型 有没有办法达到同样的目标?我们怎么知道这两个对象是以某种方式相关的,因为它们是相同的父/基“类型” 还有,即使他们是同一类型的后代,我们又怎么知道他们自己是不同类型的呢 我不知道不能使用instanceof是否是一个很大的损失,但看起来不是 注释 对于那些不熟悉Crockfo

在JavaScript中,有一种实现继承的模式,称为“函数继承”,如Crockfords“JavaScript:好的部分”第5章所述

与使用伪经典模式相比,该模式的一个缺点是我们无法使用
instanceof
操作符来区分类型

有没有办法达到同样的目标?我们怎么知道这两个对象是以某种方式相关的,因为它们是相同的父/基“类型”

还有,即使他们是同一类型的后代,我们又怎么知道他们自己是不同类型的呢

我不知道不能使用
instanceof
是否是一个很大的损失,但看起来不是

注释


对于那些不熟悉Crockford解释的人,您可以在以下位置看到一个示例:,取自。

在对象中存储父对象,然后

if (obj1.parentObject == obj2.parentObject) {//Do your things}

尽管在“函数继承”(“JavaScript:好的部分”)中有
inctanceof
,但没有特定的类型和区别
它是关于匿名函数之间的交换和关系,匿名函数通常生成具有私有功能的对象。
这些函数的逻辑层次结构使用条件首选项设置
函数可以相互调用,扩展“父”对象方法,扩展其功能。
例如,在“功能继承”中,创建一个称为“哺乳动物”的新类型如下所示:

var mammal = function (spec) { 
    var that = {}; 
    that.get_.name = function () { 
    return spec.name; 
    }; 
    that.says = function () { 
    return spec.saying || ''; 
    }; 
    return that; 
}; 
var myMammal = mammal({name: 'Herb'});
通过一些有条件的协议,我们可以将其作为父类型(类)接受。
现在我们可以创建另一个匿名函数,该函数将负责“哺乳动物”类型(类)的子类型(子类)。此函数将调用“parent”函数
哺乳动物()
,以获取具有基本功能的对象:

var cat = function (spec) { 
    spec.saying = spec.saying || 'meow'; 
    var that = mammal(spec); 
    that.purr = function (n) { 
        var i, s = ''; 
        for (i = 9; i < n; i += 1) { 
            if (s) { 
               s += 
            } 
            s += 'r'; 
        } 
        return s; 
    }; 
    that.get_name = function () { 
        return that.says() + ' ' + spec.name + ' ' + that.says(); 
    }; 
    return that; 
}; 
var myCat = cat({name: 'Henrietta'}); 
var cat=function(spec){
spec.saying=spec.saying | | |喵|;
var=哺乳动物(spec);
that.purr=函数(n){
变量i,s=“”;
对于(i=9;i
想象一下我们有这些:

mammal { giveBirth }
reptile { layEgg }
cat : mammal { purr, playWithChildren }
dog : mammal { bark }
lion : mammal { purr }
cat
继承
哺乳动物
并实现
purr()
等。)

现在想象你有一系列的动物

我想你要问的是,我们如何判断
动物[0]
是否是一只

想知道动物[0]
是否是一只猫的欲望来自我们知道猫可以做某些事情的事实。我们真正想知道的不是动物[0]是否是猫,而是动物[0]purr。也许
动物[0]。咕噜!==未定义的
比知道它是否是猫更准确。这确实意味着我们需要检查每个功能,而不是我们知道实现了几个功能的猫的容器概念,但它使实现更加健壮,并且是未来的证明(考虑一下我们是否只关心呼噜声,以及狮子后来被添加到动物类型中)


至于关于遗传的问题,我想再次建议,我们不需要知道动物是否是
哺乳动物
,我们需要知道它们是否
分娩
。这将再次确保我们的实现更能证明未来,因此,当我们添加有袋动物时,我们关于分娩而不是产卵的所有逻辑仍然有效。

操作符的
实例并不特殊。您可以按照上的说明自己实现它。有关更多详细信息,请参阅以下问题的公认答案:

下面是如何在JavaScript中实现
instanceof
操作符:

函数instanceOf(对象、构造函数){
while(对象!=null){
如果(object==constructor.prototype){//对象是构造函数的实例
返回true;
}else if(typeof object=='xml'){//xml对象的变通方法
返回constructor.prototype==XML.prototype;
}
object=object.\uuuu proto\uuu;//遍历原型链
}
返回false;//对象不是构造函数的实例
}
想要为函数继承实现
instanceOf
?这也很容易做到:

var object=child({name:“函数对象”});
警报(object.instanceOf(child));//真的
警报(object.instanceOf(base));//真的
警报(object.sayHello());//你好,我是一个函数对象
函数库(spec){
var,它={};
that.name=spec.name;
构造函数=[base];
that.instanceOf=instanceOf;
归还;
}
函数子(规范){
var=基准(规格);
thay.sayHello=sayHello;
那。构造器。推(子);
归还;
函数sayHello(){
return“你好,我是”+this.name;
}
}
函数instanceOf(构造函数){
返回此.constructors.indexOf(constructor)>=0;

}
不是每个人都读过那本书。请解释一下“功能继承”到底是什么。在哪种情况下,您会“失去使用instanceof运算符区分类型的能力”?请查看fiddle链接,这种方法不起作用,因为对父对象的引用不同。父对象只是表示相同类型的父对象,而不一定是相同的对象。我不知道这个解释是如何解决这个问题的,你的意思是说这个问题提出得不正确吗?如果是,请详细说明。是的,这就是“函数继承”的工作原理,但是这如何回答“如何区分类型”的问题呢?我已经得出了这样的概念,
instanc没有单一的替代方法