繁体   English   中英

从静态方法调用ES5类方法

[英]Call ES5 class method from static method

我想从没有实例调用的静态函数调用内部函数,如下所示:

Foo.Bar = function (options) {

    Autodesk.Viewing.Extension.call(this, options);

    ...

    this.innerFunc = function innerFunc(){
      ...
    }
};

Foo.Bar.prototype.constructor =
    Foo.Bar;

Foo.Bar.SomeStaticFunc = function () {
    innerFunc();
}

使用: Foo.Bar.SomeStaticFunc();

但我得到SomeStaticFunc is not a function

这里的例子使用了一个类的变量,比如var Foo.Bar = function (options) {...但是这与创建类的实例并不像调用内部函数那么相同?

let x= new Foo.Bar(options);
x.innerFunc();

还有另一种方法吗?

PS:我知道ES6课程,但我现在不想将这个课程迁移到ES6,因为它不是完全直截了当的。

嗯......好像你不知道JavaScript内部是如何工作的,所以这里有一个简短的回顾。 :)

  • JavaScript 一种面向对象的语言。 对象文字是对象,数组是对象,函数是对象等。

  • JavaScript 不是基于类的语言。 你可以说:“ 嘿,我已经看过class并在ES6中extends关键词! ”。 是的,但这只是语法糖。 JavaScript不是基于Java这样的类,而是基于原型

使用ES5语法,有两种方法可以创建所谓的“类”:

  • 对象字面量
  • 构造函数

当您使用对象文字时,您的类看起来像这样:

var myClass = {
  myAttribute: "foo",
  myMethod: function () {
    return "bar";
  }
};

当您使用构造函数时,您的类看起来像这样:

function MyClass() {
  this.myAttribute = "foo";
  this.myMethod = function () {
    return "bar";
  };
}

这两种方法之间当然存在差异。 使用对象文字,您有一种Singleton,其中属性在某种程度上都是静态的。 使用构造函数,您可以生成其属性将由this关键字引入的实例。 例:

var myInstance = new MyClass();
console.log(myInstance);

此实例将在其自己的属性中包含“myAttribute”和“myMethod”。 这意味着这些属性与实例相关联。 如果要调用此方法,则必须执行以下操作:

myInstance.myMethod();

到目前为止一切都很好......但是我们之前所做的事情有些不对劲。 对于MyClass每个实例,将一次又一次地创建this.myMethod ,它始终是相同的。 处理此问题的更好方法是将其放入原型中,以便所有实例共享它:

function MyClass() {
  this.myAttribute = "foo";
}

MyClass.prototype.myMethod = function () {
  return "bar";
};

这要好得多,但myMethod仍然依赖于MyClass实例......

现在我想创建一个静态方法。 根据定义,我们的静态方法将绑定到类,而不是它的实例:

MyClass.myStaticMethod = function () {
  return "baz";
};

尼斯。 在这里,为了实验,我想做这样的事情:

MyClass.myStaticMethod = function () {
  myMethod();
};

这不起作用。 为什么? 实际上, myMethod不存在于给定范围内,也不存在于外部范围内。 myMethod已在另一个函数(构造函数)中声明,并且不会返回,因此它从外部是不可见的。 而且,这个函数已经放在了MyClass的原型中。 这意味着它不是全局可用的,而是仅在MyClass实例上可用。 当你考虑它时,它是非常合乎逻辑的。 例如,当你想调用数组方法(Array.prototype中的方法)时,这样做是没有意义的:

push('test');
reverse();
includes('a');

您必须在数组(Array实例)上调用这些方法。

[].push('test');
['foo', 'bar', 'baz'].reverse();
['a', 'b'].includes('a');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM