调用没有方法的对象时的JS调用函数

时间:2014-02-26 22:32:41

标签: javascript oop object

所以我有一个对象 Obj 和一些方法。如果在没有任何方法的情况下调用该对象,我想运行一个特定的方法。那可能吗?如果是这样的话?

e.g。

function obj(variable){
    this.method = function(){};
    this.noMethod = function(){};
}
var test = new obj(variable);

调用console.log(test)现在应该在测试时调用noMethod。 我希望你明白我的意思。

如果调用方法,对象有一个nodelist,它会运行该方法。 如果您只是调用该对象,它应该返回节点列表并可能更改它,具体取决于参数。

是否有办法检查是否使用方法调用了对象?这样,如果没有调用其他方法,我可以使用if语句来检查并运行我的方法。

5 个答案:

答案 0 :(得分:1)

你看过javascript的arguments.length

function obj(variable, bool){
    if(bool)
     this.method = function(){}; 
    else
     this.noMethod = function(){};
}
var test = new obj(something, false);

调用console.log(test)会导致this.noMethod

答案 1 :(得分:1)

请注意,您想要的确切行为是不可能的(afaik),因为

  • 您希望在不将test.noMethod转换为字符串的情况下调用test,也不要将其作为调用它的函数。这意味着你需要一个吸气剂。
  • 但是,如果您将吸气剂添加到test,那么test.otherMethod也会调用test.noMethod

一些替代方案:

  • 使用.toString()方法:

    function Obj(variable){
        this.method = function(){};
        this.noMethod = function(){ alert('foo'); };
        this.toString = function(){ return this.noMethod(); }
    }
    var test = new Obj();
    test+''; // Calls test.noMethod, and returns test.noMethod()
    
  • 使用getters(1):

    function Obj(variable){
        this.method = function(){};
        this.noMethod = function(){ alert('foo'); };
    }
    var obj = {test: new Obj()}, tmp = obj.test;
    Object.defineProperty(obj, 'test', {
      get: function(){ return tmp.noMethod() }
    });
    obj.test; // Calls tmp.noMethod, and returns test.noMethod()
    obj.test.noMethod(); // Calls test.noMethod once and throws an error!
    
  • 使用getters(2):

    function Obj(variable){
        this.method = function(){};
        this.noMethod = function(){ alert('foo'); };
    }
    var obj = {test: new Obj()}, tmp = obj.test;
    Object.defineProperty(obj, 'test', {
      get: function(){ tmp.noMethod(); return tmp }
    });
    obj.test; // Calls tmp.noMethod, and returns tmp
    obj.test.noMethod(); // Calls test.noMethod twice!
    
  • 使用功能:

    function Obj(variable){
        var f = function(){ return f.noMethod(); };
        f.method = function(){};
        f.noMethod = function(){ alert('foo'); };
        return f;
    }
    var test = new Obj();
    test(); // Calls test.noMethod, and returns test.noMethod()
    test instanceof Obj // false!
    

答案 2 :(得分:0)

这应该在使用时调用no方法,并且在调用时调用方法,如果没有,那么我不确定你是否可以在没有函数的情况下完成此操作。

function Obj() {
  this.method = function(){};
  this.noMethod = function(){};
  return this.noMethod();
}

我原来说使用参数var但仍然不适合你的请求。

答案 3 :(得分:0)

您正在寻找此

function obj(){
    this.method = function(){};
    this.noMethod = function(){};
    this.toString = function() {return 'x'}
}
var test = new obj();
alert(test)

或者这个:

function obj(){
    this.method = function(){};
    this.noMethod = function(){};
}
obj.prototype.toString = function() {return 'x'}
var test = new obj();
alert(test)

在此处查看更多内容:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

答案 4 :(得分:0)

根据您对问题的评论,这并不能解决您的问题,我不确定这是否真的可行,因为我认为您试图在不调用的情况下执行某项功能一个函数 - 这可能与构造函数的想法有关 - 但在此之后我再也不认为你了。

但是这种结构可能会给你一些替代方案的想法(尽管不可否认它并不是你所追求的)。

var test = function() {
    alert('hello');

    return {
        moo : function() {
            alert('moo');
        }
    }
};

var obj = test(); //hello

obj.moo(); //moo

http://jsfiddle.net/6Vpfa/


编辑:

也许它确实有帮助,快乐的日子: - )