2015-09-18 99 views
1

想我需要聲明一些私人靜態成員在一些公共靜態方法來使用它...聲明一個JavaScript類

// ***** 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與'靜態'OOP概念有一些困難,所以我的問題是:

我可以聲明公共靜態方法裏面「對象」的「聲明主體」(如上面的「變體I」)?

+2

'supports.prototype.impl = ...' - **公共非靜態**(成員) – hindmost

+0

@hindmost:感謝校正!我相應地修復了註釋 – Serge

回答

0

我分析了一些答案後看到的唯一的解決辦法是這樣的一個:

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()聲明becames入店......所以,它他們可供選擇:

// 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!';} 
1

在JavaScript中,沒有術語或關鍵字靜態,但我們可以將這些數據直接放入函數對象中(就像在任何其他對象中一樣)。

靜態方法

靜態方法,就像變量,被連接至功能。它們大多用於對象:

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 
+0

有沒有辦法在「類體」中聲明公共靜態方法*? – Serge

+0

'callee'似乎被折舊:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee – Serge

2

在你變II也就是所謂的私人和靜態既不是民營,也不是一成不變的功能。

你是正確的,它很難定義一個類的私有靜態成員,但是如果你利用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()); 

但是,請注意,如果將原型擴展到閉包之外,則假定私有靜態成員將不可用。

+0

如何在「class」中聲明* public * static方法身體」? – Serge

+0

@Serge你已經在變體II'supports.SVG'中自己弄明白了你是靜態的。確保你將它保留在類聲明之外(因爲在你的例子中),因爲每當類被實例化時,內部的所有東西都會被執行,這也是它被用作構造函數的原因。 –

+0

所以你確認在JavaScript中**是不可能的**在'類聲明'中聲明一個「公共靜態」函數*(就像在C#中一樣),它只能被包裝在一個匿名函數中 – Serge

1

在JavaScript中沒有私有,靜態或公共的。只有當地的和全球的,範圍內的和範圍之外的。使用一個IIFE來捕獲一個變量並返回一個閉包;這應該等同於靜態方法。

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,但對它的調用之間將持續存在。

+0

如何在「class body」中聲明* public *靜態方法? – Serge

+0

JS中沒有「類身體」(至少從ES5開始)。如果你按照Java的「靜態方法」的定義,它們只是構造函數中定義的函數。如果你停止在JavaScript中編寫Java,並且開始編寫JavaScript,你會更加高興。 – Amadan