自问题被提出已经近8年了,但我想给出一个之前未曾提到过的答案。原帖作者说这个方法行不通:
action="javascript:simpleCart.checkout()"
楼主表示尝试所有好的建议后,这段代码仍然无法正常运行。因此我猜测问题可能出在这里:将checkout()
作为simpleCart
类的静态方法调用,但也有可能checkout()
实际上是一个实例成员,而不是静态成员。这取决于他如何定义checkout()
。
顺便提一下,simpleCart
很可能是一个类名,按照惯例,类名的首字母应该大写,所以我们在这里也采用这个约定。我们使用名称SimpleCart
。
以下是一些示例代码,演示如何将checkout()
定义为实例成员。在ECMA-6之前,这是正确的方法:
function SimpleCart() {
...
}
SimpleCart.prototype.checkout = function() { ... };
许多人使用了一种不同的技术,如下所示。这种方法很流行,也很有效,但我不建议采用,因为实例应该只在原型上定义一次,而以下技术在每个实例上都重复定义成员变量,定义在this
上。
function SimpleCart() {
...
this.checkout = function() { ... };
}
以下是使用官方 class
在ECMA-6中定义 实例(instance) 的示例:
class SimpleCart {
constructor() { ... }
...
checkout() { ... }
}
与ECMA-6中的静态定义相比,它们之间只有一个单词不同:
class SimpleCart {
constructor() { ... }
...
static checkout() { ... }
}
这里是旧方法(ECMA-6之前)的静态定义。请注意,checkout()
方法在函数外定义。它是函数对象的成员,而不是原型对象的成员,这就使它成为一个静态方法。
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创建一个类的静态作用域内的注册表,并调用代理静态方法,同时将参数传递给代理使其给出实例在注册表中的索引,最后让代理调用实际的实例成员函数。类似这样:
SimpleCart.registry[1234] = new SimpleCart();
action="javascript:SimpleCart.checkout(1234);"
SimpleCart.checkout = function(myIndex) {
var myThis = SimpleCart.registry[myIndex];
myThis.checkout();
}
你也可以将索引存储为元素的属性。
但通常在HTML中什么都不做,在JavaScript中使用.addEventListener()并使用.bind()能力会更容易。