我定义了两个函数如何相互继承,如下所示:
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专家,我的代码是否有任何改进(继承方法,也许)?
谢谢.
然后我需要定义一个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()
,但由于双方proto
并Shape
共享相同的prototype
属性,JavaScript不能看出其中的差别.
您通常无法看到原型链(尽管Firefox和WebKit通过该__proto__
属性使其可用),但它是实际在JS中处理继承的方式; 可见的Function.prototype属性仅用于在new
-time 设置原型链的初始状态.
如何将isInstance添加到实例,而不仅仅是函数?
Object.prototype.isInstance(c)= function() { return this instanceof c; }
我不确定这真的会让你受益匪浅!对Object进行原型设计通常被认为是品味不佳,因为它会影响每个对象,并且可能会使用Object将其他脚本混淆为查找映射.
我的代码是否有任何改进(继承方法,也许)?
我喜欢你的继承方法,它是制作对象系统的更轻量级和JavaScripty方法之一.
随着instanceof
你可能会失去的parent
和constructor
属性,除非你想让他们为其他方便的目的.我把它parent
放在构造函数上(所以它就像知道它的基类的子类),我会调用constructor
其他的东西(已经constructor
在Firefox中调用了属性,但它没有按照你的想法进行,通常是最好的避免).
我看到的唯一缺点是你不能继承构造函数,所以每次你创建一个新的子类时,你必须编写一个调用基础构造函数的构造函数,即使你的子类的构造函数什么都不做:
function Square() { Shape.apply(this, arguments); } Square.inherit(Shape);