我正在尝试javascript中的继承,并编写了这两个函数:
Object.prototype.inherits=function(obj){this.prototype=new obj;}
Object.prototype.pass=function(obj){obj.prototype=new this;}
此代码非常有效:
Dog.inherits(Animal);
但以下失败:
Animal.pass(Dog);
据我了解,我的传递函数不起作用,因为“this”不是对象实例本身的引用?如果是这种情况,我如何从内部引用对象?
提前致谢!
答案 0 :(得分:1)
嗯,实际上两者完全一样:
Dog.prototype = new Animal;
方法中的this
值将引用调用引用的基础对象,例如:
Dog.inherits(Animal);
this
值将引用Dog
构造函数,obj
参数将是Animal
函数。
致电时:
Animal.pass(Dog);
this
值将引用Animal
函数,最后与inherits
方法完全相同,但反过来。
我建议您不扩展Object.prototype
对象,因为它可能会导致很多问题,例如,这两个属性将在任何for-in
中枚举循环,例如:
for (var prop in {}) { // <-- an empty object!
alert(prop); // will alert 'inherits' and 'pass'
}
所有对象都继承自Object.prototype
,似乎您打算仅在Function对象上使用这些方法,扩展Function.prototype
对象或将方法实现为带来的函数会更安全两个参数。
答案 1 :(得分:1)
适用于我,测试代码如下:
function Animal() {}
Animal.prototype.isanimal= 1;
function Dog() {}
Animal.pass(Dog);
Dog.prototype.isdog= 2;
alert(new Dog().isanimal); // 1
alert(new Dog().isdog); // 2
但请注意,new this
或new obj
会调用函数this/obj
,从而创建一个新的完整实例。如果你在该函数中有构造函数代码需要接收一些参数,或者设置实例状态,那么你最终可能会遇到问题。要创建一个新的this
而不调用this
作为函数,您可以使用不执行任何操作的其他构造函数:
function nonconstructor() {}
nonconstructor.prototype= this.prototype;
obj.prototype= new nonconstructor();
此外,您应该避免将原型设计到Object
。这会导致使用Object
作为通用查找映射的代码出现问题。由于您似乎只使用构造函数,因此Function
上的原型设计应该满足您的需求并且更加安全。