2013-11-01 80 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

非常感谢。帮助很多! –