Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象如何在Javascript中引用自身?_Javascript_Oop_Object_Reference_This - Fatal编程技术网

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

对象如何在Javascript中引用自身?,javascript,oop,object,reference,this,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”不是对对象实例本

我在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”不是对对象实例本身的引用?如果是这样的话,我如何从对象内部引用它呢


提前谢谢

事实上,这两个人做的完全一样:

Dog.prototype = new Animal;
方法中的
这个
值将引用调用引用的基本对象,在以下情况下:

Dog.inherits(Animal);
this
值将引用
Dog
构造函数,
obj
参数将是
Animal
函数

当你打电话时:

Animal.pass(Dog);
this
值将引用
Animal
函数,其最终执行的操作与
继承
方法完全相同,但相反

我建议您不要扩展
对象.prototype
对象,因为它会给您带来很多问题,例如,这两个属性将在任何
for in
循环中枚举,例如:

for (var prop in {}) { // <-- an empty object!
  alert(prop); // will alert 'inherits' and 'pass'
}

for(var prop in{}{/对我有效,测试代码如下:

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
但是,请记住,
newthis
newobj
将调用函数
this/obj
,创建一个新的完整实例。如果该函数中的构造函数代码期望接收一些参数或设置实例状态,则可能会出现问题。要创建新的
this
,而不调用e> 这
作为一个函数,您可以使用不执行任何操作的其他构造函数:

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

另外,您应该避免在
对象上进行原型设计。这会给使用
对象作为通用查找映射的代码带来麻烦。因为您似乎只使用构造函数,所以在
函数上进行原型设计应该能满足您的需要,而且安全得多。

是的,这两个函数都工作得很好,我猜我犯了一个错误当我测试它的时候…谢谢你的建议。