自从提出这个问题以来已经快 8 年了,但我会冒险给出一个以前没有给出的答案。OP说这不起作用:
action="javascript:simpleCart.checkout()"
OP 说,尽管尝试了他得到的所有好建议,但这段代码仍然失败。所以我冒险猜测一下。动作checkout()
作为simpleCart
类的静态方法调用;但也许checkout()
实际上是一个实例成员,而不是static。这要看他是怎么定义checkout()
的。
顺便说一句,simpleCart
大概是一个类名,按照惯例,类名的首字母大写,所以让我们在这里使用那个约定。让我们使用名称SimpleCart
。
这是一些示例代码,说明了定义checkout()
为实例成员。这是在 ECMA-6 之前的正确方法:
function SimpleCart() {
...
}
SimpleCart.prototype.checkout = function() { ... };
许多人使用了不同的技术,如下所示。这很流行,并且有效,但我反对它,因为实例应该在 , 上定义prototype
一次,而以下技术定义成员 onthis
并在每次实例化时重复这样做。
function SimpleCart() {
...
this.checkout = function() { ... };
}
这是ECMA-6中的一个实例定义,使用官方class
:
class SimpleCart {
constructor() { ... }
...
checkout() { ... }
}
与ECMA-6 中的静态定义进行比较。区别就一个字:
class SimpleCart {
constructor() { ... }
...
static checkout() { ... }
}
这是旧方式的静态定义,在 ECMA-6 之前。请注意,该checkout()
方法是在函数之外定义的。它是函数对象的成员,而不是原型对象,这就是它成为static的原因。
function SimpleCart() {
...
}
SimpleCart.checkout = function() { ... };
this
由于它的定义方式,静态函数对于关键字引用的内容会有不同的概念。请注意,实例成员函数是使用this
关键字调用的:
this.checkout();
使用类名调用静态成员函数:
SimpleCart.checkout();
问题是 OP 希望将调用放入 HTML 中,它将在全局范围内。他不能使用关键字this
,因为this
它会引用全局范围(即window
)。
action="javascript:this.checkout()" // not as intended
action="javascript:window.checkout()" // same thing
在 HTML 中使用实例成员函数没有简单的方法。您可以结合 JavaScript 做一些事情,在类的静态范围内创建一个注册表,然后调用代理静态方法,同时将参数传递给该代理,该代理将索引提供给您的实例的注册表,然后拥有代理调用实际的实例成员函数。像这样的东西:
// In Javascript:
SimpleCart.registry[1234] = new SimpleCart();
// In HTML
action="javascript:SimpleCart.checkout(1234);"
// In Javascript
SimpleCart.checkout = function(myIndex) {
var myThis = SimpleCart.registry[myIndex];
myThis.checkout();
}
您还可以将索引存储为元素的属性。
但通常更容易在 HTML 中什么都不做,而在 JavaScript 中使用.addEventListener()
并使用该.bind()
功能。