2014-02-20 47 views
1

有了這個劇本我添加變量的對象上運行:JavaScript的動態變量

function MyDocument(someDocument) 
{ 
if(!(someDocument instanceof KnownDocumentClass)) 
    throw "Object must be an instance of KnownDocumentClass: " + someDocument; 
this.Document = someDocument; 
this.Fields = {}; 
this.updateValues = function() 
    { 
     for (var _it = this.Document.iterator(); _it.hasNext();) 
     { 
      var _property = _it.next(); 
      try 
      { 
       this[_property.getQualifiedName()] = _property.getContent(); 
      } 
      catch(err) 
      { 
       log("Error :"+err); 
      } 
     } 
    } 
this.updateValues(); 

}

因此,例如,我可以用

var mydoc = new MyDocument(knownjavadoc); 
log(mydoc.Creator) // Shows the original content. 

此內容可以有多個類型(一些是int,一些String和許多其他自定義Java類)。因此,它可以發生log(mydoc.SomeProperty)回報:

PropertyObjectImpl[id=abc123, data=Some Data, type=Node, order=42]

我知道,我可以將函數添加到MyDocument

this.getValueAsString = function(name) 
{ 
    var _prop = this[name]; 
    if(_prop instanceof PropertyObjectImpl) 
     return "PropertyObject with ID : " + _prop.getID(); 
    else 
     return _prop; 
} 

但對於鍛鍊目的,我想這個功能直接添加作爲toValueString()這些屬性,以便撥打電話:

var value = mydoc.SomeProperty.toValueString() 

而不是

var value = mydoc.getValueAsString("SomeProperty"); 

這可能嗎?

回答

2

您可以覆蓋所討論類型的.toString()實現,而不是執行可能會執行相同操作的內容。

重寫.toString()對現有各類

Number.prototype.toString = function() { 
    // return .toString() logic for Number types 
} 

Boolean.prototype.toString = function() { 
    // return .toString() logic for Number types 
} 

上的自定義類型

var CustomType = (function() { 
    function CustomType() { 
     // CustomType logic 
    } 

    CustomType.prototype.toString = function() { 
     // return .toString() logic for CustomType 
    } 

    return CustomType; 
})(); 

記住重寫.toString()toString()內置的JavaScript規範的所有對象,所以你可能會堅持這樣約定重寫這個,而不是實現你自己的方法。這比實現自定義方法的可能性更小,因爲.toString()應該可以從任何屬性中調用,而。 toValueString()只能在實現它的屬性上調用。如果你的方法需要返回一個完全自定義的字符串,對於任何類型,那麼你需要確保你將自定義方法實現綁定到退出類型(Number,String,Boolean,Function,Object等)

編輯2:正如指出的那樣,覆蓋的toString的默認實現被認爲是不好的做法,所以另一個想法是將您的自定義方法在對象級別綁定,所以它是可調用的任何東西(因爲幾乎一切在JavaScript中擴展對象)

Object.prototype.toValueString = function() { 
    // return default implementation for this method; 
} 

CustomType.prototype.toValueString = function() { 
    // return specific implementation for this method; 
} 
+2

我不會建議重新定義toString,因爲它不會觸摸你不擁有的物體(比如像jQuery這樣的PrototypeJs庫)。標準/本機對象應該按預期行事。 – pbo

+0

感謝您的回答,不是一個壞主意,但像pbo說的,我不想覆蓋所有這些對象的默認toString()。 – Kooki

+0

@Kooki,看到我的第二個編輯 – series0ne

1

我對你的問題有點困惑,但我會給它一個鏡頭。

在JS中,有一個將值轉換爲字符串的標準接口:toString()。這是在Object上實現的,這意味着所有對象(以及對象轉換的基元)都將具有預期的行爲。

var obj = { 
    age: 25, 
    customField: { 
     name: "test", 
     toString: function() { return this.name }; 
    } 
}; 

obj.age.toString(); // "25" 
obj.customField.toString() // "test" 

作爲一個方面說明,我只會大寫變量/引用是函數構造函數(js類)。這在社區中非常標準。

+0

感謝您的回答,但'obj.customField.toString()'不適用於我,因爲它返回像obj.customField('PropertyObjectImpl [id = abc123,data = Some Data,type = Node,order = 42]')並且我對這些對象或他的函數沒有影響... – Kooki

+0

Js是動態的,你可以擴展這些對象還是簡單地使用toString方法設置它們? – pbo

+0

另一種選擇是將這些對象中的每一個都包裹起來以符合您所需的任何接口。 Object.create(propertyObject)是您將創建一個從其繼承的新對象的一種方法。然後用return附加一個toString – pbo