2014-02-26 82 views
2

所以我有一個對象對象用一些方法。如果沒有任何方法調用該對象,我想運行一個特定的方法。那可能嗎?如果是這樣如何?當調用對象時沒有方法的JS調用函數

例如

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

調用console.log(test)現在應該在測試中調用noMethod。 我希望你明白我的意思。

該對象有一個nodelist,如果你調用一個方法,它會運行該方法。 如果你只是調用對象,它應該返回節點列表並可能改變它,這取決於參數。

有沒有辦法檢查對象是否用方法調用?這樣我可以有一個if語句來檢查並運行我的方法,如果沒有其他方法被調用。

+0

也許ü應該考慮代理http://wiki.ecmascript.org/ doku.php?id = harmony:direct_proxies –

+0

嗨Lukas,你的問題的背景是什麼?你正在尋找一種方式來查看控制檯中的細節? –

+0

我應該多解釋一下,該對象有一個nodelist。我想要運行一個方法或返回節點列表。 –

回答

0

這應該調用沒有方法時使用,並調用一個方法,如果不是那麼我不知道你可以做到這一點,沒有一個函數。

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

我最初說要使用參數var,但仍然不符合您的要求。

+0

這個問題,因爲我最初發布類似 - 是在他的obj,他會調用方法,並調用no方法..因爲test.method()也調用沒有參數的obj。 –

+0

使用「新」運算符通常引用「構造函數設計模式」 爲了避免誤解代碼樣式/約定,請簡單查看構造函數模式 http://addyosmani.com/resources/essentialjsdesignpatterns/ book /#constructorpatternjavascript – dsuess

+0

這隻有在我永遠不會用參數初始化obj時纔有效,對吧?我也需要這一點,在上面調整。 –

1

你看着及arguments.length爲JavaScript

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

調用console.log(test)應導致this.noMethod

+0

你的例子是倒退的,但是有效的。 – Mouseroot

+0

我認爲這在執行新對象('some value')時失敗;因爲它不會是0. –

+0

@Mouseroot非常細心,謝謝! – mrpanda

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

+1

但是,這隻適用於我需要它在字符串上下文。如果我做console.log(測試)它不會調用toString,對嗎? (多數民衆贊成在我嘗試它時發生了什麼) –

+0

正確。 Console.log是它自己的一頭野獸。 AFAIK,它只是調用toString來迭代項目屬性。 –

1

注意你想要的確切行爲是不可能的(據我所知),因爲

  • 要撥打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() 
    
  • 使用吸氣劑(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! 
    
  • 使用吸氣劑(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! 
    
0

從對這個問題您的意見,這並不完全解決你是什麼之後,我不知道如果這是真的有可能,因爲我認爲你試圖在不調用函數的情況下執行一個函數 - 這對於構造函數的想法是可能的 - 但我不認爲你在這之後。

但是,這種結構可能會給你一些替代方案的想法(儘管承認這不是你真正想要的)。

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

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

var obj = test(); //hello 

obj.moo(); //moo 

http://jsfiddle.net/6Vpfa/


編輯:

也許它確實幫助,幸福的日子:-)

+0

好吧,它看起來非常像我需要的東西,你爲什麼說它不是我所需要的? –

+0

酷!很幸運!我之所以這麼認爲的原因是,test()的行爲類似於構造函數,應該只執行一次,因爲它每次都會返回一個新的「moo函數」。但你可能會扭曲這個以適應你的需求。 –

+0

補償我認爲它確實不起作用。因爲如果你需要返回節點列表,你會遇到麻煩,它只能用於alert,因爲它會自動調用。 –

相關問題