如何在当前方法中调用另一个对象的方法?
示例:
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。这个看似简单的问题是我整天都在苦苦挣扎的问题,我作为最后的手段来到这里。
答案 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()方法怎么样?我很困惑他们如何在这种情况下适用。
查看第一个问题的答案。是否使用call或apply取决于需要传递的参数以及您是否打算先对它们进行任何处理。
你能解释一下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
中定义的函数。 call
和apply
可用于调用值this
的任何函数更改为您传递到apply
或call
的对象。
请记住,您正在将方法附加到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()
}