我遇到了一个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。为什么它的成员方法仍未定义?
答案 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,这个实例目前是未定义的。