2013-11-01 106 views
0

我想用JavaScript中的方法構建自己的對象,但是,在我第一次嘗試使用下面的代碼時返回完整的代碼「已在Chrome瀏覽器開發工具的控制檯沒有方法 'WriteOut的'。Javascript對象用方法返回「沒有方法」我的方法名稱「」錯誤

var link = function bhLink(options) { 

     defaultOptions = { 
      targetURL: '#', 
      target: '_blank', 
      textColor: '#000', 
      bgColor: '#fff', 
      font: 'Arial', 
      fontSize: '12px', 
      lineHeight: '12px', 
      text: '[Test]' 
     } 

      if (typeof options == 'object') { 
       options = $.extend(defaultOptions, options); 
      } else { 
       options = defaultOptions; 
      } 

     link.prototype.writeOut = function() { 
      return $('<a></a>') 
       .prop({'href':this.targetURL, 'target': this.target}) 
       .css({'font-family':this.font, 'color':this.textColor, 'font-size': this.fontSize, 'line-height':this.lineHeight}); 
     } 
    } // end link 

我使用它像

$('#id_of_some_button').click(function(e) { 
    e.preventDefault(); 
    $('#id_of_some_div').html(link.writeOut); 
}); 

兩個click事件和鏈接是內$(document).ready({});塊。

有何想法?

編輯 =========================================== ===

添加選項,參數和if語句來請檢查是否有提供的選項..

+0

你執行'link'?如果沒有,那麼它還沒有給writeOut方法。通常方法被添加到構造函數的原型* outside *之外。 –

+0

第一個問題:'link.writeOut'訪問一個屬性,而'link.writeOut()'執行一個方法。 – Blazemonger

+0

評論者!還請看看我說這是我的第一次嘗試的地步..在這裏變得尷尬! :) –

回答

2

你的語法是在建立包含有方法的對象的嘗試很奇怪。首先,您正嘗試使用this來訪問defaultOptions對象。其次,調用html()塊中的writeOut只是傳遞函數引用,而不是實例化函數。試試這個:

var link = {  
    defaultOptions: { 
     targetURL: '#', 
     target: '_blank', 
     textColor: '#000', 
     bgColor: '#fff', 
     font: 'Arial', 
     fontSize: '12px', 
     lineHeight: '12px', 
     text: '[Test]' 
    }, 
    writeOut: function() { 
     return $('<a></a>', { 
      'text': this.defaultOptions.text, 
      'href': this.defaultOptions.targetURL, 
      'target': this.defaultOptions.target 
     }) 
     .css({ 
      'font-family': this.defaultOptions.font, 
      'color': this.defaultOptions.textColor, 
      'font-size': this.defaultOptions.fontSize, 
      'line-height': this.defaultOptions.lineHeight 
     }); 
    }  
} // end link 

$('#id_of_some_button').click(function (e) { 
    e.preventDefault(); 
    $('#id_of_some_div').append(link.writeOut()); 
}); 

Example fiddle

+0

感謝羅裏,它現在正在工作。這是我第一次嘗試,所以請原諒,如果這似乎是垃圾。但你的回答肯定會給我一個好的開始。另外,我拿出函數接受選項對象的部分作爲參數,如果我想檢查參數是否有效,則需要替換默認選項。在這種情況下,你的答案如何修改?例如請在一分鐘內查看我的問題的更新。 –

+1

如果您傳遞選項,聽起來更像是您創建插件。試試這個:http://jsfiddle.net/PAG2Q/。請注意'$ .extend'行覆蓋默認選項對象,並傳遞給插件調用 - 注意我覆蓋'text'選項 –

+0

非常感謝。幫助很多! –