在另一个对象中调用另一个对象的方法

时间:2014-08-07 03:57:38

标签: javascript

如何在当前方法中调用另一个对象的方法?

示例:

function OjbectA() {}

ObjectA.prototype.doWork = function () {
  alert('do work');
}

var objectA = new ObjectA();

function ObjectB() {}

ObjectB.prototype.method = function() {

   // How to call Object A's doWork() method
}

当前尝试:

// Call doWork
ObjectA.doWork();

错误:"类型错误:未定义doWork()函数。

问题:

在方法中调用另一个对象的方法的正确方法是什么。范围怎么样?

ObjectA是否必须实例化以调用它的方法?

apply()call()方法怎么样?我很困惑他们如何在这种情况下适用。

最后评论

我想提前感谢大家的意见。我最近刚刚进入了javascript的OOP。这个看似简单的问题是我整天都在苦苦挣扎的问题,我作为最后的手段来到这里。

5 个答案:

答案 0 :(得分:1)

有一个拼写错误,而不是ObjectA.doWork();使用objectA.doWork();

答案 1 :(得分:1)

  

在方法中调用另一个对象的方法的正确方法是什么。范围怎么样?

没有人"正确"办法。据推测,您希望能够调用ObjectA实例的方法(即 ObjectA.prototype 的方法),但将ObjectB的实例作为 this ,所以:

ObjectB.prototype.method = function() {

    // How to call Object A's doWork() method
    ObjectA.prototype.doWork.call(this);
}

这将调用该方法并将 ObjectB 的实例设置为 this

  

ObjectA是否必须实例化以调用它的方法?

如果您的意思是"那么ObjectA的实例必须实例化以调用其方法"然后没有,如上所示。您可以直接在构造函数的原型上调用该方法。

  

apply()或call()方法怎么样?我很困惑他们如何在这种情况下适用。

查看第一个问题的答案。是否使用callapply取决于需要传递的参数以及您是否打算先对它们进行任何处理。

其他答案

  

你能解释一下ObjectA.prototype.doWork.call(this)的机制吗?

它调用该方法并将其 this 设置为提供的对象。有关如何将值分配给的规则在EMCA–2626 §10.4.3中进行了解释。

  

ObjectA.prototype.doWork(this)会以同样的方式工作吗?

没有。它调用该函数,将其 this 设置为 ObjectA.prototype ,并从调用执行上下文中提供 this 的值作为第一个参数。例如如果是浏览器中的全局代码,请有效:

ObjectA.prototype.doWork(window);

答案 2 :(得分:1)

可以直接从原型中调用它。

使用apply将函数执行中this的值更改为提供的值,因此它本质上将this转发为调用中的自身。 你也可以使用call,区别在于它的参数如何,apply取一个数组,而call取一个参数列表。

ObjectB.prototype.method = function() {
  ObjectA.prototype.doWork.apply(this);
}

然而,ObjectB当然不一定具有与ObjectA相同的属性,因此请确保尽可能将该方法编写为通用方法。按顺序使用文档概念而​​不是内部实现细节。

再次举例说明了Array,它的一般适用方法是如何记录的,并说明了它的工作所需。

如果您只是想公开一个'实用功能',只需将它放在对象本身上即可。 e.g

ObjectA.doWork = function(obj) {
};

答案 3 :(得分:1)

似乎与JavaScript的一般OOP模型存在一些混淆。

每个函数都有一个基础prototype,它只是一个对象。您可能会也可能不会添加任何内容,但如果您这样做,您可能会计划将该函数用作constructor。这就是你在这里看到的情况:

function ObjectA() {}

ObjectA.prototype.doWork = function () {
  alert('do work');
}

var objectA = new ObjectA();

objectA.doWork();

但是,在某些情况下,仅使用直接附加到其上的某些方法创建函数可能更具吸引力,而不是创建它的实例。通常,这些是静态方法,就像在其他语言中一样,或者你的函数实际上只是一个单例对象。在这种情况下,您将省略prototype,并直接附加,如下所示:

function ObjectA() {}

ObjectA.doWork = function () {
  alert('do work');
}

ObjectA.doWork()

回到第一个例子,如果您定义函数并向其prototype添加方法,有时您可能希望实际调用已在另一个函数prototype中定义的函数。 callapply可用于调用值this的任何函数更改为您传递到applycall的对象。

请记住,您正在将方法附加到prototype,因此它可能看起来有点时髦,但这是一个例子:

function ObjectA() {}

ObjectA.prototype.doWork = function () {
    console.log(this)
}

var objectA = new ObjectA();

function ObjectB() {}

ObjectB.prototype.method = function() {

   ObjectA.prototype.doWork.call(this);
}

var objectB = new ObjectB();

objectB.method() 

// -> objectB will be logged to your console, bc 
// it became the value of this in ObjectA's doWork method.

答案 4 :(得分:0)

毕竟我发现了你的拼写错误:

function OjbectA() {}

应为function ObjectA() {}

这就是你面临错误的原因。


function ObjectA() {}

ObjectA.prototype.doWork = function () {
  alert('do work');
}

var objectA = new ObjectA();

function ObjectB() {}

ObjectB.prototype.method = function() {

   objectA.doWork()
}