jd.*_*jd. 0 javascript inheritance instanceof
我定义了两个函数如何相互继承,如下所示:
Function.prototype.inherit = function(parent){
function proto() {}
proto.prototype = parent.prototype;
this.prototype = new proto();
this.prototype.constructor = this;
this.prototype.parent = parent;
Run Code Online (Sandbox Code Playgroud)
}
然后我需要定义一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
这在比较两个函数时工作正常,但在比较实例化变量时则不行.
Object2.inherit(Object1);
Object2.isInstance(Object1); //returns true
var obj2 = new Object2();
obj2.isInstance(Object1);// obj2.isInstance is not a function
Run Code Online (Sandbox Code Playgroud)
上面的最后一个案例是我想要的工作.如何将isInstance添加到实例,而不仅仅是函数?对于那里的所有javascript专家,我的代码是否有任何改进(继承方法,也许)?
谢谢.
然后我需要定义一个isInstance函数,它的行为类似于Java的instanceOf或PHP的instanceof.
JavaScript本身有instanceof什么问题?
鉴于你的继承功能,
function Shape() {};
function Square() {};
Square.inherit(Shape);
alert(new Square() instanceof Shape); // true
Run Code Online (Sandbox Code Playgroud)
instanceof通过检查给定构造函数的prototype属性是否在实例的原型链中来工作.所以,例如.
function A() {};
function B() {};
var b= new B();
A.prototype= B.prototype;
alert(b instanceof A); // true
Run Code Online (Sandbox Code Playgroud)
这就是为什么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;
}
Run Code Online (Sandbox Code Playgroud)
我不确定这真的会让你受益匪浅!对Object进行原型设计通常被认为是品味不佳,因为它会影响每个对象,并且可能会使用Object将其他脚本混淆为查找映射.
我的代码是否有任何改进(继承方法,也许)?
我喜欢你的继承方法,它是制作对象系统的更轻量级和JavaScripty方法之一.
随着instanceof你可能会失去的parent和constructor属性,除非你想让他们为其他方便的目的.我把它parent放在构造函数上(所以它就像知道它的基类的子类),我会调用constructor其他的东西(已经constructor在Firefox中调用了属性,但它没有按照你的想法进行,通常是最好的避免).
我看到的唯一缺点是你不能继承构造函数,所以每次你创建一个新的子类时,你必须编写一个调用基础构造函数的构造函数,即使你的子类的构造函数什么都不做:
function Square() {
Shape.apply(this, arguments);
}
Square.inherit(Shape);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2244 次 |
| 最近记录: |