面向对象javascript这个词其实有些多余, 因为Javascript这门语言就是完全面向对象的, 也不可能以非面向对象的方法来使用。 不过大多数编程新手(包括使用javascript的)的常见弱点在于按照功能编写代码, 而不考虑任何上下文或者组织。
要完整理解如何编写最优化的javascript代码, 就必须
1) 理解javascript对象是如何工作的
2) 他们和其他语言的对象有何不同
3) 以及怎样使用才对你有益。
扯淡的部分完了, 下面干货来鸟。
1. 对象以及对象创建的方式
对象是javascript的基础。 事实上, 这门语言里所有的东西都是对象。 这门语言的大部分功能都是基于这一点。 对象是一系列属性的集合, 和其他语言里的散列表结构类似。
// By build-in Object.
var obj = new Object();
obj.val = 0;
obj.click = function(){
console.log('click me...');
}
// By {}
var obj = {
val: 0,
click: function(){
console.log('click me...');
}
}
// By constructor
var Obj = function(){}
var obj1 = new Obj();
var obj2 = new obj1.constructor();
2. 公共方法
公共方法(public method)在对象的上下文中是最终用户始终可以接触到的。要实现在对象的每个实例中都可以使用的公共方法, 必须了解一个属性‘prototype’, 关于这个概念在后面的博文中会详细的阐述。
// Creates new object.
function User(name, age){
this.name = name;
this.age = age;
}
// Adds public method for User.
User.prototype.getName = function(){
return this.name;
}
User.prototype.getAge = function(){
return this.age;
}
// Test
var user = new User('Byorn', 20);
console.log(user.getName());
console.log(user.getAge());
3. 私有方法
私有方法(private method)定义一些只让对象内部访问, 而外部无法访问的代码。
function User(name, age){
this.name = name;
this.age = age;
function showName(){
console.log(name);
}
// call private method
// show errors
showName();
}
var user = new User('Byron', 20);
// Cannot call this metod
// will show error.
user.showName();
4. 特权方法
这个方法从字面上理解就感觉很屌的样子, 它到底屌在哪里?
特权方法(privileged method), 指代那些在查看并且处理(对象中)似有变量的同时允许用户以公共方法的方式访问。
function User(name, age){
this.name = name;
this.age = age;
this.showName = function(){
console.log(name);
}
}
var user = new User('Byron', 20);
// We can get name of user by this way.
user.showName();
// But we cannot access the private variable 'name'
user.name() // show error.
5. 静态方法
稍微接触过点其他面向对象语言都很轻松的理解静态方法。 就是类里定义的静态方法。
静态方法的实质与任何其他一般的函数没有什么不同, 最主要的区别在于,其他函数是以对象的静态属性形式存在的。作为属性, 它们不能在该对象的示例的上下文中访问,而只属于对象本书的那个上下文中。(有点拗口, 且看下面的例子一定会让你豁然开朗)
function User(name, age){
this.name = name;
this.age = age;
}
// Static method.
User.clone = function(user){
return new User(){
user.getName,
user.getAge
}
}
6. 静态变量
对于静态方法自然会想到静态变量, 在javascript中怎样表示静态变量呢。 分为两种情况
1) 私有静态变量
这里牵扯到闭包的知识, 不懂的自行脑补。直接上代码:
// private static variable
(function(){
var privateStaticVar = 'private static variable';
Func = function(){
this.setPrivateStaticVar = function(value){
privateStaticVar = value;
}
this.getPrivateStaticVar = function(){
return privateStaticVar;
}
}
})();
var func1 = new Func();
var func2 = new Func();
console.log(func1.getPrivateStaticVar());
console.log(func2.getPrivateStaticVar());
func1.setPrivateStaticVar('private');
console.log(func1.getPrivateStaticVar());
console.log(func1.getPrivateStaticVar());
2) 公共静态变量
这有点像公共静态方法了,上代码:
Func = function(){
this.test = 'test';
}
Func.acfun= 'net';
console.log(Func.acfun); //net