shi*_*zou 4 javascript static ecmascript-5
我想从没有实例调用的静态函数调用内部函数,如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
使用:Foo.Bar.SomeStaticFunc();.
但我明白了SomeStaticFunc is not a function.
这里的例子使用了一个变量用于类,var Foo.Bar = function (options) {...但是不像创建类的实例那样并调用内部函数?
let x= new Foo.Bar(options);
x.innerFunc();
Run Code Online (Sandbox Code Playgroud)
还有另一种方法吗?
PS:我知道ES6课程,但我现在不想将这个课程迁移到ES6,因为它不是完全直截了当的.
Bad*_*bra 18
好吧......看来你不知道JavaScript内部是如何工作的,所以这里有一个简短的回顾.:)
JavaScript 是一种面向对象的语言.对象文字是对象,数组是对象,函数是对象等.
JavaScript 不是基于类的语言.你可以这么说:" 嘿,我在ES6中看过class和extends关键字! ".是的,但这只是语法糖.JavaScript不是基于Java这样的类,而是基于原型.
使用ES5语法,有两种方法可以创建所谓的"类":
当您使用对象文字时,您的类看起来像这样:
var myClass = {
myAttribute: "foo",
myMethod: function () {
return "bar";
}
};
Run Code Online (Sandbox Code Playgroud)
当您使用构造函数时,您的类看起来像这样:
function MyClass() {
this.myAttribute = "foo";
this.myMethod = function () {
return "bar";
};
}
Run Code Online (Sandbox Code Playgroud)
这两种方法之间当然存在差异.使用object literal,你有一种Singleton,其中属性在某种程度上都是静态的.使用构造函数,您可以生成其属性将由this关键字引入的实例.例:
var myInstance = new MyClass();
console.log(myInstance);
Run Code Online (Sandbox Code Playgroud)
此实例将在其自己的属性中包含"myAttribute"和"myMethod" .这意味着这些属性与实例相关联.如果要调用此方法,则必须执行以下操作:
myInstance.myMethod();
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很好......但是我们之前所做的事情有些不对劲.this.myMethod将为每个实例一次又一次地创建MyClass,它总是相同的.处理此问题的更好方法是将其放入原型中,以便所有实例共享它:
function MyClass() {
this.myAttribute = "foo";
}
MyClass.prototype.myMethod = function () {
return "bar";
};
Run Code Online (Sandbox Code Playgroud)
这要好得多,但myMethod仍然与MyClass实例有关......
现在我想创建一个静态方法.根据定义,我们的静态方法将绑定到类,而不是它的实例:
MyClass.myStaticMethod = function () {
return "baz";
};
Run Code Online (Sandbox Code Playgroud)
尼斯.在这里,为了实验,我想做这样的事情:
MyClass.myStaticMethod = function () {
myMethod();
};
Run Code Online (Sandbox Code Playgroud)
这不起作用.为什么?实际上,myMethod在给定范围内也不存在于外部范围内.myMethod已被声明在另一个函数(构造函数)中,并且它不会被返回,因此它从外部是不可见的.而且,这个功能已被放入原型中MyClass.这意味着它不是全局可用的,而是仅在实例上可用MyClass.当你考虑它时,它是非常合乎逻辑的.例如,当你想调用数组方法(Array.prototype中的方法)时,这样做是没有意义的:
push('test');
reverse();
includes('a');
Run Code Online (Sandbox Code Playgroud)
您必须在数组(Array实例)上调用这些方法.
[].push('test');
['foo', 'bar', 'baz'].reverse();
['a', 'b'].includes('a');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9380 次 |
| 最近记录: |