'command' in Google 闭包有原型吗?

Does 'command' in Google Closure have the prototype?

我正在使用 Google 闭包并尝试执行如下操作:

abc.edf.commands.showToast = function() {
    abc.edf.commands.showToast.test(); // this works fine
    this.test2(); // this will throw an error like:   
    // exception_logger.js:88 TypeError: this.test2 is not a function
};

abc.edf.commands.showToast.test = function() {
    console.log('test');
};

abc.edf.commands.showToast.prototype.test2 = function() {
    console.log('test2');
};

我认为 JavaScript 中的每个对象都有 'prototype'。那么是因为 'command' 不是一个对象吗?或者我错过了别的东西?谢谢:)

正如 Felix Kling 评论的那样,您需要使用 new 创建对象才能使用 test2 原型函数。这是一个例子:

goog.provide('abc.edf.commands.showToast');

/** @constructor */
abc.edf.commands.showToast = function() {};

abc.edf.commands.showToast.test = function() {
    console.log('test');
};

abc.edf.commands.showToast.prototype.test2 = function() {
    console.log('test2');
};

abc.edf.commands.showToast.test(); // static class method
var foo = new abc.edf.commands.showToast();
foo.test2(); // instance method

您可以尝试在 online closure compiler 中输入该代码。这是它使用简单编译编译成的内容:

var abc={edf:{}};
abc.edf.commands={};
abc.edf.commands.showToast=function(){};
abc.edf.commands.showToast.test=function(){console.log("test")};
abc.edf.commands.showToast.prototype.test2=function(){console.log("test2")};
abc.edf.commands.showToast.test();
var foo=new abc.edf.commands.showToast;
foo.test2();

这是它使用高级编译编译的结果:

console.log("test");
console.log("test2");

为了测试,我将编译后的代码保存到文件 "showToast.js" 并制作了一个简单的 html 页面来加载它:

<!doctype html>
<html>
<head>
</head>
<body>
  <p>ShowToast Test</p>
  <script src="showToast.js"></script>
</body>
</html>