当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中实现isInstance

如何解决《在Javascript中实现isInstance》经验,为你挑选了1个好方法。

我定义了两个函数如何相互继承,如下所示:

Function.prototype.inherit = function(parent){

function proto() {}
proto.prototype = parent.prototype;

this.prototype = new proto();
this.prototype.constructor = this;
this.prototype.parent = parent; 

}

然后我需要定义一个isInstance函数,它的行为类似于Java的instanceOf或PHP的instanceof.实质上,isInstance可用于确定变量是否是从父函数继承的函数的实例化对象.

这就是我写的:

Function.prototype.isInstance = function(func){
if(this == func){
    return true;
} else{
    if (this.prototype.parent == undefined || this.prototype.parent == null) {
        return false;   
    } else {
        return this.prototype.parent.isInstance(func);          
    }
}

}

这在比较两个函数时工作正常,但在比较实例化变量时则不行.

Object2.inherit(Object1);

Object2.isInstance(Object1); //returns true

var obj2 = new Object2();

obj2.isInstance(Object1);// obj2.isInstance is not a function

上面的最后一个案例是我想要的工作.如何将isInstance添加到实例,而不仅仅是函数?对于那里的所有javascript专家,我的代码是否有任何改进(继承方法,也许)?

谢谢.



1> bobince..:

然后我需要定义一个isInstance函数,它的行为类似于Java的instanceOf或PHP的instanceof.

JavaScript本身有instanceof什么问题?

鉴于你的继承功能,

function Shape() {};
function Square() {};
Square.inherit(Shape);
alert(new Square() instanceof Shape); // true

instanceof通过检查给定构造函数的prototype属性是否在实例的原型链中来工作.所以,例如.

function A() {};
function B() {};
var b= new B();
A.prototype= B.prototype;
alert(b instanceof A); // true

这就是为什么instanceof Shape即使Square.prototype没有使用创作的原因new Shape; 相反,它被创造new proto(),但由于双方protoShape共享相同的prototype属性,JavaScript不能看出其中的差别.

您通常无法看到原型链(尽管Firefox和WebKit通过该__proto__属性使其可用),但它是实际在JS中处理继承的方式; 可见的Function.prototype属性仅用于在new-time 设置原型链的初始状态.

如何将isInstance添加到实例,而不仅仅是函数?

Object.prototype.isInstance(c)= function() {
    return this instanceof c;
}

我不确定这真的会让你受益匪浅!对Object进行原型设计通常被认为是品味不佳,因为它会影响每个对象,并且可能会使用Object将其他脚本混淆为查找映射.

我的代码是否有任何改进(继承方法,也许)?

我喜欢你的继承方法,它是制作对象系统的更轻量级和JavaScripty方法之一.

随着instanceof你可能会失去的parentconstructor属性,除非你想让他们为其他方便的目的.我把它parent放在构造函数上(所以它就像知道它的基类的子类),我会调用constructor其他的东西(已经constructor在Firefox中调用了属性,但它没有按照你的想法进行,通常是最好的避免).

我看到的唯一缺点是你不能继承构造函数,所以每次你创建一个新的子类时,你必须编写一个调用基础构造函数的构造函数,即使你的子类的构造函数什么都不做:

function Square() {
    Shape.apply(this, arguments);
}
Square.inherit(Shape);

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有