在 JavaScript class 中声明一个 public "static" 函数
Declare a public "static" function inside a JavaScript class
假设我需要声明一些 private static 成员以在某些 public 静态 方法...
// ***** Variant I *****
function supports() {
var impl = document.implementation; // private, non-static
this.SVG = function () { // public, non-static
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
}
// ***** Variant II *****
function supports() { }
supports.prototype.impl = document.implementation; // public, non-static
supports.SVG = function () { // public, static
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
我知道在 JavaScript 中使用 'static' OOP 概念有一些困难,所以我的问题是:
我可以声明 public static 方法 inside "declaration body" 的 'object'(如上面的 "Variant I")?
在JavaScript中,没有术语或关键字static,但我们可以将此类数据直接放入函数对象中(就像在任何其他对象中一样)。
静态方法
静态方法,就像变量一样,附加到函数。它们主要用于对象:
function Animal(name) {
arguments.callee.count = ++arguments.callee.count || 1
this.name = name
}
Animal.showCount = function() {
alert( Animal.count )
}
var mouse = new Animal("Mouse")
var elephant = new Animal("elephant")
Animal.showCount() // 2
在您的 Variant II 中,应该是私有和静态的函数既不是私有的也不是静态的。
你是对的,定义 class 的私有静态成员是相当困难的,但如果你利用 JavaScript 的作用域是可能的。
var Person = (function(){
var privateStaticProperty = true;
function privateStatic() {
return privateStaticProperty;
}
function Person(){
// class declarations
}
Person.prototype.example = function() {
return privateStatic();
}
return Person;
}());
var p = new Person();
console.log(p.example());
但是请注意,如果您将原型扩展到闭包之外,则所谓的私有静态成员将不可用。
JavaScript 中没有 private、static 或 public。只有局部和全局,范围内和范围外。使用 IIFE 捕获变量和 return 闭包;这应该等同于静态方法。
var supports = (function supportsWrapper() {
var impl = document.implementation; // "static"-ish.
return function supports() {
this.SVG = function () {
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
}
})();
impl
将仅初始化一次,并且只能由 supports
读取,但会在两次调用之间持续存在。
我分析了一些答案后看到的唯一解决方案是这个:
var Person = (function () {
var _privateStatic = 'private static member';
function privateStatic() {
return _privateStatic + ' + private-s-function';
}
function Person() {
this.publicNonStatic = 'public, non-static member';
this.publicFunction = function () {
return this.publicNonStatic + '+ public non-static-function';
}
var _privateNonStatic = 'private, non-static member';
function privateNonStatic() {
return _privateNonStatic + " + private-ns-function"
}
this.publicStatic = Person.publicStatic = 'public static member';
this.publicStaticFunction = Person.publicStaticFunction = function () {
return Person.publicStatic + ' + public static function';
}
// Accessible internal
var test = _privateNonStatic;
test = _privateStatic;
test = privateStatic();
test = privateNonStatic();
// other class declarations
}
return Person;
}());
// Accessible external members:
var p = new Person();
console.log(p.publicFunction());
console.log(p.publicNonStatic);
console.log(p.publicStatic);
console.log(p.publicStaticFunction());
console.log(Person.publicStatic);
console.log(Person.publicStaticFunction());
PS。
不过我指出 publicStaticFunction() 仅在 new Person()
声明后才可访问...因此,在 之前 不是可用:
// Accessible external members:
console.log(Person.publicStatic); // NO WAY
console.log(Person.publicStaticFunction()); // NO WAY
var p = new Person(); // lazy declaration
console.log(Person.publicStatic); // IS OK!
console.log(Person.publicStaticFunction()); // IS OK!
,所以我想没有办法在函数 Person
主体内实现它,只能在包装 Person
...
的匿名函数内实现
所以最初的 SVG 样本应该是这样的:
var supports = (function(){
function supports() { this.SVG = supports.SVG; }
supports.SVG = function () {
return document.implementation.hasFeature("http://shortened", "1.1");
};
return supports;
}());
// usage of public, static method
if (supports.SVG()) {return 'supports SVG!';}
假设我需要声明一些 private static 成员以在某些 public 静态 方法...
// ***** Variant I *****
function supports() {
var impl = document.implementation; // private, non-static
this.SVG = function () { // public, non-static
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
}
// ***** Variant II *****
function supports() { }
supports.prototype.impl = document.implementation; // public, non-static
supports.SVG = function () { // public, static
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
我知道在 JavaScript 中使用 'static' OOP 概念有一些困难,所以我的问题是:
我可以声明 public static 方法 inside "declaration body" 的 'object'(如上面的 "Variant I")?
在JavaScript中,没有术语或关键字static,但我们可以将此类数据直接放入函数对象中(就像在任何其他对象中一样)。
静态方法
静态方法,就像变量一样,附加到函数。它们主要用于对象:
function Animal(name) {
arguments.callee.count = ++arguments.callee.count || 1
this.name = name
}
Animal.showCount = function() {
alert( Animal.count )
}
var mouse = new Animal("Mouse")
var elephant = new Animal("elephant")
Animal.showCount() // 2
在您的 Variant II 中,应该是私有和静态的函数既不是私有的也不是静态的。
你是对的,定义 class 的私有静态成员是相当困难的,但如果你利用 JavaScript 的作用域是可能的。
var Person = (function(){
var privateStaticProperty = true;
function privateStatic() {
return privateStaticProperty;
}
function Person(){
// class declarations
}
Person.prototype.example = function() {
return privateStatic();
}
return Person;
}());
var p = new Person();
console.log(p.example());
但是请注意,如果您将原型扩展到闭包之外,则所谓的私有静态成员将不可用。
JavaScript 中没有 private、static 或 public。只有局部和全局,范围内和范围外。使用 IIFE 捕获变量和 return 闭包;这应该等同于静态方法。
var supports = (function supportsWrapper() {
var impl = document.implementation; // "static"-ish.
return function supports() {
this.SVG = function () {
return impl.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
};
}
})();
impl
将仅初始化一次,并且只能由 supports
读取,但会在两次调用之间持续存在。
我分析了一些答案后看到的唯一解决方案是这个:
var Person = (function () {
var _privateStatic = 'private static member';
function privateStatic() {
return _privateStatic + ' + private-s-function';
}
function Person() {
this.publicNonStatic = 'public, non-static member';
this.publicFunction = function () {
return this.publicNonStatic + '+ public non-static-function';
}
var _privateNonStatic = 'private, non-static member';
function privateNonStatic() {
return _privateNonStatic + " + private-ns-function"
}
this.publicStatic = Person.publicStatic = 'public static member';
this.publicStaticFunction = Person.publicStaticFunction = function () {
return Person.publicStatic + ' + public static function';
}
// Accessible internal
var test = _privateNonStatic;
test = _privateStatic;
test = privateStatic();
test = privateNonStatic();
// other class declarations
}
return Person;
}());
// Accessible external members:
var p = new Person();
console.log(p.publicFunction());
console.log(p.publicNonStatic);
console.log(p.publicStatic);
console.log(p.publicStaticFunction());
console.log(Person.publicStatic);
console.log(Person.publicStaticFunction());
PS。
不过我指出 publicStaticFunction() 仅在 new Person()
声明后才可访问...因此,在 之前 不是可用:
// Accessible external members:
console.log(Person.publicStatic); // NO WAY
console.log(Person.publicStaticFunction()); // NO WAY
var p = new Person(); // lazy declaration
console.log(Person.publicStatic); // IS OK!
console.log(Person.publicStaticFunction()); // IS OK!
,所以我想没有办法在函数 Person
主体内实现它,只能在包装 Person
...
所以最初的 SVG 样本应该是这样的:
var supports = (function(){
function supports() { this.SVG = supports.SVG; }
supports.SVG = function () {
return document.implementation.hasFeature("http://shortened", "1.1");
};
return supports;
}());
// usage of public, static method
if (supports.SVG()) {return 'supports SVG!';}