向构造函数添加方法

时间:2017-07-04 09:38:16

标签: javascript javascript-objects

以一种允许我们使用方法调用语法的方式重构carlike函数" dot access"。



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




但是,如果工作不正常,可能会发生错误,而且工作效果很好!

提前感谢☺

5 个答案:

答案 0 :(得分:2)

这里的问题是你试图在没有参数的情况下执行功能车,正确的解决方案应该是改变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 :(得分:0)

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

您可能希望将obj绑定到car参数,因此当您调用move时,它会自动设置。但是,我会像这样重构整个代码(使用类语法):

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();

答案 2 :(得分:0)

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

答案 3 :(得分:0)

首先,如果您将函数carlike视为构造函数,那么您必须在使用之前进行实例化,以便您的代码应该面向对象。

回答你的问题:

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

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

无需在移动函数中传递params,因为您在carlike构造函数中使用它,移动函数将成为方法,carlike的所有上下文也可用。因此,您可以使用carlike构造函数(this.loc

的上下文中的loc

答案 4 :(得分:0)

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



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);

但是编写那种代码并没有任何意义。