向构造函数添加方法
问题描述:
以一种允许我们使用“点访问”的方法调用语法的方式重构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();
答
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
)
答
与obj在运行时创建。如果您像以前的代码片段一样在外部引用该方法,那么javascript解释器不知道您引用了哪个对象。是的,有一个例外,如你可以调用方法如下:
如果要引用当前创建的对象,则必须在构造对象的函数内部定义方法。像下面的代码:
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
amy.move(amy);
ben.move(ben);
但写这种代码没有任何意义。
请从'move'功能中删除参数'car'。这是过时的和误导性的 – Thomas
是的,谢谢!我完全忘记了这一点 – dloeda