为什么我不能使用member方法来初始化实例?

时间:2015-03-30 09:07:55

标签: javascript

我遇到了一个JavaScript构造函数问题,这似乎是关于JavaScript的一些基本知识。但是,我不知道。有人可以帮助我吗?

我想创建Circle的实例。圆形构造函数如下所示:

var Circle = function(radius) {
   var _radius;
   // An exception is thrown at using member method setRadius.
   this.setRadius(radius);

   this.setRadius = function(value) {
      _radius = value;
   };
};
var circle = new Circle(5);

抛出一个异常,说this.setRadius未定义。我不知道这里出了什么问题。是否发生异常是因为setRadius的定义是在调用之后?如果我在调用之前移动setRadius的定义,一切都会顺利。

var Circle = function(radius) {
   var _radius;
   this.setRadius = function(value) {
      _radius = value;
   };

   this.setRadius(radius);
};

如果在原型中定义了setRadius,则完全没有问题。

var Circle = function(radius) {
   this.radius;
   // It's OK to use the method on the prototype chain.
   this.setRadius(radius);
};

Circle.prototype.setRadius = function(value) {
   this.radius = value;
};

我非常确定成员方法能够使用其后定义的另一个成员方法。以下代码运作良好。

var Circle = function(radius) {
   var _radius = radius;

   this.enlarge = function(per) {
      this.setRadius(_radius*per);
   };

   this.setRadius = function(value) {
      _radius = value;
   };
};
var circle = new Circle(5);
circle.enlarge(1.1);

因此,在创建实例时,为什么我不能使用成员方法? Javascript是一种解释语言。因此,当我启动新实例时,已经解释并生成了构造函数Function。为什么它的成员方法仍未定义?

1 个答案:

答案 0 :(得分:0)

在调用之前放置setRadius。

var Circle = function(radius) {
   var _radius;


   this.setRadius = function(value) {
      _radius = value;
   };

   // An exception is thrown at using member method setRadius.
   this.setRadius(radius);
};

var circle = new Circle(5);

在调用伪类Circle时,根据你的语句首先设置一个局部变量_radius,然后调用同一个实例的setRadius,这个实例目前是未定义的。