js中这两种方法表示的区别是什么

时间:2011-03-16 13:58:40

标签: javascript json

我正在开发一个网站。我得出结论,我需要为我的javascript代码构建一个更复杂的框架。我已经开始研究如何编写javascript库的不同示例。我想出了一些令人困惑的方法来记下方法。我真的很赞赏一些澄清。

所以我通常会写下一个方法:

var ReportEnhancements =
 function () {
     this.Name = function()
     {
        alert('It is me!');
     }
}

这是另一种表示方法的方法:

 ReportEnhancements.prototype.Tooltip = {
          setByTitle :function(elementsToTooltip) {
              alert('I am about to be tooltiped!')
         }
 }

有两件事令我困惑:

  1. 我什么时候应该使用prototype关键字?我应该何时将该方法声明为成员的名字?
  2. 看看setByTitle和Name,正如您所看到的,它们是不同的,即使它们都声明方法并且两个方法都是公共的。
  3. 为什么this.Name = function()和setByTitle:function()之间存在差异。为什么有两种不同的语法来声明方法?
  4. 修改

    我越来越接近理解这些差异了,但还有一个我尚未完全掌握的重大问题。为什么这两种方式表示方法,从而类有两种不同的访问规则。我似乎无法在javascript对象文字中声明私有方法。另一方面,如果我有一个常规的嵌套元素,我似乎无法将它作为公共修饰符公开。访问修饰符是什么东西?

    谢谢!

2 个答案:

答案 0 :(得分:2)

一个显着的区别(虽然这不符合为什么是首选)是范围。

在前者中,this.Name()可以访问外部函数中声明的任何其他变量,因为它只是一个闭包。它被称为“特权方法”。

完全在原始范围之外声明的后一版本无法访问这些“私有”成员变量。

从技术上讲,后者实际上更有效,因为该功能只创建一次。在第一个版本中,每次实例化该类型的对象时都会重新创建内部函数。如果你只有几个这样的对象在处理并不重要,但是如果你要创建数百个,那么你真的应该使用基于prototype的方法。

编辑 - 关于您对访问修饰符的修改:

嗯,实际上根本没有访问修改

前一种方法创建一个“闭包”,闭包可以包含变量声明,这些声明具有仅本地范围。但是,函数也是一个对象,因此向this添加属性会将这些属性暴露给外部世界。 “导出”方法或变量的常用方法是执行此操作:

var MyType = function() {
    var method = function() { ... };   // this is private variable

    this.method = method;              // this is a public property pointing
};                                     // to the private variable

另一方面,后一个带有对象文字的方法不会创建闭包,它只是一堆命名属性,其碰巧包含函数引用。

可以从外部访问对象的所有属性,因此使用对象文字创建的所有属性都是隐式“公共”。

答案 1 :(得分:1)

使用原型,您可以修改标准的javascript对象。例如,您可以

String.prototype.encode = function(){...};

Function.prototype.declareMethod = function(param){   this.prototype [param.name] = param.functionBody;   归还这个; };

因为函数在原型链中,所以你可以在其他任何东西上使用delcareMethod。