问题描述
|
对于一个新项目,我需要编写一个JavaScript库,但不确定如何构造它。我昨天在这里阅读了许多关于stackoverflow的文章和问题。
我喜欢支持公共和私人职能和课程。所以这是我的结果:
(function(window) {
var Library = Library || {};
// Library namespace
Library = (function() {
function privateFunc() {
return \"I\'m a private functon in Library.\";
}
var privateClass = function(param) {
var _param = param;
}
return {
constructor: Library,publicFunc: function() {
return \"I\'m a publicFunc functon in Library.\";
}
};
})();
// String namespace
_namespace(\'String\');
Library.String = (function() {
function privateFunc() {
return \"I\'m a private functon in Library.String.\";
}
return {
constructor: Library.String,publicFunc: function() {
return \"I\'m a publicFunc functon in Library.String.\";
},publicClass: function(param) {
var _param = param;
}
};
})();
// global function
function _namespace(name) {
...
}
// register libary
window.Library= window.$L = Library;
})(window);
这是构建库的好方法还是有更好的方法?
以及如何为我的privateClass / publicClass实现私有和公共功能?
谢谢
解决方法
javascript中没有私有/公共功能的概念。按照惯例,以下划线开头的函数被视为私有函数。
, 只是惹上Raynos(我几年前写过):
私有,公共和静态变量
我们在对象中定义变量的方式决定了对象可以使用哪些方法来访问这些变量。在JavaScript中,使用OO代码时,方法和属性分为五个级别。
私有在对象内部用\'var variableName \'或\'function functionName \'声明。只能由其他私有或特权功能访问。
公共在对象内部用\'this.variableName \'声明。可以通过任何功能或方法进行更改。
特权在对象内部用\'this.functionName = function(){...} \'声明。可以通过任何函数或方法进行访问,并且可以调用引用或更改任何私有变量。
原型使用\'Class.prototype.variableName \'或\'Class.prototype.functionName \'声明。以这种方式声明的函数将可以访问任何公共变量或原型变量。尝试更改以这种方式创建的变量将改为在对象上创建一个新的公共变量,并且原型变量将不可用。
用\'Class.variableName \'或\'Class.functionName \'静态声明。可以通过任何功能或方法进行更改。这种方法很少使用。
要了解这些不同的级别,让我们看一个示例:
function Cat(name,color){
/*
Constructor: any code in here is run when the object is created
*/
Cat.cats++;
/*
Private variables and functions - may only be accessed by private or privileged functions.
Note that \'name\' and \'color\',passed into the Class,are already private variables.
*/
var age = 0;
var legs = 4;
function growOlder(){
age++;
}
/*
Public variables - may be accessed publicly or privately
*/
this.weight = 1;
this.length = 5;
/*
Privileged functions - may be accessed publicly or privately
May access Private variables.
Can NOT be changed,only replaced with public versions
*/
this.age = function(){
if(age==0) this.length+=20;
growOlder();
this.weight++;
}
}
/*
Prototyped Functions - may be accessed publicly
*/
Cat.prototype = {
talk: function(){ alert(\'Meow!\'); },callOver: function(){ alert(this.name+\' ignores you\'); },pet: function(){ alert(\'Pet!\'); }
}
/*
Prototyped Variables - may be accessed publicly.
May not be overridden,only replaced with a public version
*/
Cat.prototype.species = \'Cat\';
/*
Static variables and functions - may be accessed publicly
*/
Cat.cats = 0;