首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从静态方法调用ES5类方法

从静态方法调用ES5类方法
EN

Stack Overflow用户
提问于 2017-04-18 22:27:28
回答 1查看 16.2K关注 0票数 8

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

代码语言:javascript
复制
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

示例here为类使用了一个变量,比如var Foo.Bar = function (options) {...,但这不就等同于像这样创建一个类的实例并调用内部函数吗?

代码语言:javascript
复制
let x= new Foo.Bar(options);
x.innerFunc();

有没有其他方法可以做到这一点?

PS:我知道ES6类,但我不喜欢将这个类迁移到ES6,因为它不是完全直接的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-19 08:02:22

好吧..。您似乎不知道JavaScript内部是如何工作的,所以这里快速回顾一下。:)

  • JavaScript 是一种面向对象的语言。对象字面量是对象,数组是对象,函数是对象,etc.
  • JavaScript 不是基于类的语言。你可以说:“嘿,我在ES6中见过classextends关键字!”是的,但这只是语法上的糖。Java不是基于类的,而是基于prototypes.

的JavaScript

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

  • An object literal
  • A构造函数

当您使用对象文字时,您的类如下所示:

代码语言:javascript
复制
var myClass = {
  myAttribute: "foo",
  myMethod: function () {
    return "bar";
  }
};

当您使用构造函数时,您的类如下所示:

代码语言:javascript
复制
function MyClass() {
  this.myAttribute = "foo";
  this.myMethod = function () {
    return "bar";
  };
}

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

代码语言:javascript
复制
var myInstance = new MyClass();
console.log(myInstance);

这个实例在它自己的属性中有"myAttribute“和"myMethod”。这意味着这些属性被绑定到实例。如果要调用此方法,则必须执行以下操作:

代码语言:javascript
复制
myInstance.myMethod();

到目前为止一切顺利..。但是我们之前做的事情有问题。将为每个MyClass实例一次又一次地创建this.myMethod,并且它始终是相同的。处理此问题的更好方法是将其放在原型中,这样所有实例都可以共享它:

代码语言:javascript
复制
function MyClass() {
  this.myAttribute = "foo";
}

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

这要好得多,但myMethod仍然绑定到MyClass实例...

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

代码语言:javascript
复制
MyClass.myStaticMethod = function () {
  return "baz";
};

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

代码语言:javascript
复制
MyClass.myStaticMethod = function () {
  myMethod();
};

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

代码语言:javascript
复制
push('test');
reverse();
includes('a');

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

代码语言:javascript
复制
[].push('test');
['foo', 'bar', 'baz'].reverse();
['a', 'b'].includes('a');
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43474967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档