重新定义函数的'toString'和'valueOf'

时间:2012-12-17 06:30:39

标签: javascript function

我定义了一个Node的原型函数'isElement',我希望它能像'div.isElement'一样返回'true'。

<div id="dom1">someText
    <p>This is p1 of <span class="bold">dom1</span></p>
</div>

Node.prototype.isElement = (function(){
    var result;
    var fn = function(){
        console.log(obj);
        result = (this.nodeType == 1 ? true : false);
        return result;
    };
    fn.toString = fn.valueOf = function(){
        return result;
    };
    return fn;
})();

var dom1 = document.getElementById('dom1');
dom1.isElement();  //true
dom1.isElement;  //true

如果'dom1'从不调用函数'isElement()',那么'dom1.isElement'返回'undefined'。我理解为什么它会返回'undefined',但我想知道当'isElement()'永远不会被调用时如何让它返回'true'或'false'。

我只想使用它:

if(dom1.isElement){//do something}

但不喜欢:

if(dom1.isElement()){//do something}

等待答案,谢谢。

2 个答案:

答案 0 :(得分:1)

如评论中所述,JavaScript语言不保证DOM实现提供标准的JS对象工具。

也就是说,如果您确定您的环境始终支持这些,那么在这种情况下会调用getter,实际上您可以编写一个在请求特定属性值时调用的函数。

有关详细信息,请参阅MDN

Node.prototype.__defineGetter__('isElement', 
  function () { return this.nodeType === 1; });

使用浏览器在http://jsfiddle.net/L5hBq/

进行测试

答案 1 :(得分:0)

您可以添加一个具有您的函数作为getter的属性:

Object.defineProperty(Node.prototype, "isElement", {
    get: function() {
        var result = this.nodeType == 1;
        return result;
    }
});