在类定义中使用this.prototype?

时间:2011-11-17 18:46:45

标签: javascript

我有一个类定义,它是类定义的一部分。

var someObject = {
   someClass: function() {
      this.someMethod = function() {
         alert('hello');
      };
   }
}

我被告知我应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是我似乎需要在定义构造函数之后添加prototyped方法,就像这样......

var someObject = {
   someClass: function() {

   }
}

someObject.someClass.prototype.someMethod = function() {
   alert('hello');
};

理想情况下,我想在构造函数中定义原型方法,就像这样......

var someObject = {
   someClass: function() {
      this.prototype.someMethod = function() {
         alert('hello');
      };
   }
}

这会导致错误,但声明原型​​为null或不是对象。有没有办法实现我想要的,或者这是不可能的?

2 个答案:

答案 0 :(得分:1)

是的,你不能在类的构造函数中访问prototype属性,但你可以做一些不同的代码表示法,所以它可能对你有帮助:

var someObject = {
   someClass: (function wrapper() {
      var ctor = function(){};
      ctor.prototype.someMethod = function(){
        alert('hello');
      };
      return ctor;
   })()
}

答案 1 :(得分:1)

您可以使用arguments.callee或 - 如果您不覆盖构造函数的.prototype属性 - this.constructor而不是普通this,即可

var someObject = {
   someClass: function() {
      // this.constructor.prototype should work as well
      arguments.callee.prototype.someMethod = function() {
         alert('hello');
      };
   }
};

然而,将函数表达式放回到构造函数中会破坏练习的整个目的 - 将原型中的函数对象的引用存储到实例中并不重要,您仍然在创建一个新的每个构造函数调用一个!

一种可能的解决方案是使用匿名构造函数而不是对象文字,从而为您提供免费的额外范围:

var someObject = new (function() {
    function someClass() {}

    someClass.prototype.someMethod = function() {
        alert('hello');
    };

    this.someClass = someClass;
});

有关使用对象文字和包装函数的等效解决方案,请参阅Paul's answer,这可能更为熟悉。