Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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 在类定义中使用this.prototype?_Javascript - Fatal编程技术网

Javascript 在类定义中使用this.prototype?

Javascript 在类定义中使用this.prototype?,javascript,Javascript,我有一个类定义,它是类定义的一部分 var someObject = { someClass: function() { this.someMethod = function() { alert('hello'); }; } } 我被告知应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是,我似乎需要在定义构造函数后添加原型方法,如下所示 var someObject = { someClass: fun

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

var someObject = {
   someClass: function() {
      this.someMethod = function() {
         alert('hello');
      };
   }
}
我被告知应该使用prototype来添加方法,因为它只需要为对象的所有实例创建一次。问题是,我似乎需要在定义构造函数后添加原型方法,如下所示

var someObject = {
   someClass: function() {

   }
}

someObject.someClass.prototype.someMethod = function() {
   alert('hello');
};
var someObject = {
   someClass: function() {
      this.prototype.someMethod = function() {
         alert('hello');
      };
   }
}
理想情况下,我希望在构造函数中定义原型方法,如下所示

var someObject = {
   someClass: function() {

   }
}

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

但是,这会导致一个错误,指出原型为null或不是对象。是否有一种方法可以实现我想要的,或者这是不可能的?

是的,您不能在类的构造函数中访问prototype属性,但您可以使用稍微不同的代码表示法,因此它可能对您有所帮助:

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

您可以使用
参数.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;
});

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

Prototype并不是这样工作的。@IAbstractDownvoteFactory您能详细说明一下吗?当然会出现错误,因为“this”表示该对象的实例,而不是“definition”该对象或其属性或方法的属性。@Birey
this
表示调用函数时创建的对象,如
var object=new someObject.someClass()我现在明白了。它来自不同的语言背景,一开始并没有点击。这么简单,现在我想起来了。原型只被调用一次的原因是它在构造函数之外。我喜欢将原始对象转换为匿名构造函数的想法,这样我就可以在那里放置原型方法,而不是在初始对象定义之后。