向构造函数添加方法

问题描述:

以一种允许我们使用“点访问”的方法调用语法的方式重构carlike函数。向构造函数添加方法

var carlike = function(obj, loc) { 
 
    obj.loc = loc; 
 
    return obj; 
 
}; 
 

 
var move = function(car) { 
 
    car.loc++; 
 
}; 
 

 
var amy = carlike({}, 1); 
 
var ben = carlike({}, 9); 
 

 
/* 
 
Here we want to call move with "dot access" 
 

 
amy.move(); 
 
ben.move(); 
 
*/

这就是我所做的...

var carlike = function(obj, loc) { 
 
    obj.loc = loc; 
 
    obj.move = move;//CHANGE#1 
 
    return obj; 
 
}; 
 

 
var move = function(car) { 
 
    car.loc++; 
 
}; 
 

 
var amy = carlike({}, 1); 
 
var ben = carlike({}, 9); 
 
amy.move();//CHANGE#2 
 
ben.move();//CHANGE#3

但不会一起工作,这HAVING错误有关位置VA RIABLE,直到工作好!

谢谢你在前进☺

这里的问题是你想执行功能的车不带参数的,妥善的解决办法要改变move功能是这样的:

var move = function() { 
    this.loc++; 
}; 

现在,你所访问的对象在功能我第一种情况是amy,第二种是ben。最终的解决方案应该是这样的。

var carlike = function(obj, loc) { 
 
    obj.loc = loc; 
 
    obj.move = move; 
 
    return obj; 
 
}; 
 

 
var move = function() { 
 
    this.loc++; 
 
}; 
 

 
var amy = carlike({}, 1); 
 
var ben = carlike({}, 9); 
 
amy.move(); 
 
ben.move();

+1

请从'move'功能中删除参数'car'。这是过时的和误导性的 – Thomas

+0

是的,谢谢!我完全忘记了这一点 – dloeda

obj.move = move.bind(window,obj); 

您可能要绑定的obj的汽车参数,所以当你调用移动它就会被自动设置。不过,我想重组整个这样的代码(使用类语法):

class Car { 
constructor(val=0){ 
    this.loc=val; 
} 
move(distance=1){ 
    this.loc+=distance; 
} 
set(pos){ 
    this.loc=pos; 
} 
} 

var ben=new Car(10); 
console.log(ben.loc); 
ben.move(); 

var carlike = function(obj, loc) { 
 
    obj.loc = loc; 
 
    obj.move = move;//CHANGE#1 
 
    return obj; 
 
}; 
 

 
var move = function() { 
 
    this.loc++; 
 
    console.log(this.loc); 
 
}; 
 

 
var amy = carlike({}, 1); 
 
var ben = carlike({}, 9); 
 
amy.move();//CHANGE#2 
 
ben.move();//CHANGE#3

首先,如果你正在考虑你的函数carlike作为构造,那么你必须实例使用前,让你的代码应该是面向对象的方式。

回答你的问题:

var move = function() { 
     this.loc++; 
     console.log(this.loc); 
    }; 

    var amy = new carlike({}, 1); 
console.log(amy.move()); 

没有必要,通过PARAMS在移动功能,因为你正在使用它您carlike构造有用于移动功能内将成为法和carlike所有情况下也可用于它。因此,您可以使用carlike构造函数的上下文中的loc。(this.loc

如果要引用当前创建的对象,则必须在构造对象的函数内部定义方法。像下面的代码:

var carlike = function(obj, loc) { 
 
    obj.loc = loc; 
 
    obj.move = function() { 
 
    obj.loc++; 
 
    console.log(obj.loc); 
 
    } 
 
    return obj; 
 
}; 
 

 
var amy = carlike({}, 1); 
 
var ben = carlike({}, 9); 
 
amy.move();//CHANGE#2 
 
ben.move();//CHANGE#3
与obj在运行时创建。如果您像以前的代码片段一样在外部引用该方法,那么javascript解释器不知道您引用了哪个对象。是的,有一个例外,如你可以调用方法如下:

amy.move(amy); 
ben.move(ben); 

但写这种代码没有任何意义。