【问题标题】:How does an object reference itself in Javascript?对象如何在 Javascript 中引用自身?
【发布时间】:2011-04-17 05:43:25
【问题描述】:

我在 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 oop object reference this


    【解决方案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 对象或将方法实现为带有两个参数的函数会更安全。

    【讨论】:

    • 是的,这两个功能都可以正常工作,我猜我在测试时弄错了...谢谢您的建议。
    【解决方案2】:

    为我工作,测试代码如下:

    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 上进行原型设计应该可以满足您的需求并且更安全。

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多