我正在开发一个网站。我得出结论,我需要为我的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!')
}
}
有两件事令我困惑:
修改
我越来越接近理解这些差异了,但还有一个我尚未完全掌握的重大问题。为什么这两种方式表示方法,从而类有两种不同的访问规则。我似乎无法在javascript对象文字中声明私有方法。另一方面,如果我有一个常规的嵌套元素,我似乎无法将它作为公共修饰符公开。访问修饰符是什么东西?
谢谢!
答案 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。