2014-02-20 42 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