1

使用此脚本,我在运行时将变量添加到对象:

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是 s 和许多其他自定义 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");

这可能吗?

4

2 回答 2

2

您可以只覆盖相关.toString()类型的实现,而不是实现可能会做同样事情的东西。

覆盖.toString()现有类型

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

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

覆盖.toString()自定义类型

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

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

    return CustomType;
})();

请记住,toString()它内置于所有对象的 JavaScript 规范中,因此您可能会坚持这样的约定来覆盖它,而不是实现自己的方法。与实现自定义方法相比,这也不太可能中断,因为.toString()应该可以从任何属性调用,而 . toValueString()只能在实现它的属性上调用。

编辑:如果您的方法需要为任何类型返回完全自定义的字符串,那么您需要确保将自定义方法实现绑定到现有类型(数字、字符串、布尔值、函数、对象等)

编辑 2:正如所指出的,覆盖 toString 的默认实现被认为是不好的做法,所以另一个想法是在对象级别绑定您的自定义方法,以便它可以从任何东西调用(因为 JavaScript 中的几乎所有东西都扩展了对象)

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

CustomType.prototype.toValueString = function() {
    // return specific implementation for this method;
}
于 2014-02-20T11:55:55.870 回答
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 类)的变量/引用大写。这在社区中几乎是标准的。

于 2014-02-20T12:01:32.030 回答