对象如何在Javascript中引用自身?

时间:2010-09-25 18:35:32

标签: javascript oop object reference this

我正在尝试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”不是对象实例本身的引用?如果是这种情况,我如何从内部引用对象?

提前致谢!

2 个答案:

答案 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 thisnew obj会调用函数this/obj,从而创建一个新的完整实例。如果你在该函数中有构造函数代码需要接收一些参数,或者设置实例状态,那么你最终可能会遇到问题。要创建一个新的this而不调用this作为函数,您可以使用不执行任何操作的其他构造函数:

function nonconstructor() {}
nonconstructor.prototype= this.prototype;
obj.prototype= new nonconstructor();

此外,您应该避免将原型设计到Object。这会导致使用Object作为通用查找映射的代码出现问题。由于您似乎只使用构造函数,因此Function上的原型设计应该满足您的需求并且更加安全。