Javascript 面向对象基础

对象是Javascript的基础。事实上,这门语言里所有的东西都是对象。从最基本的层次上说,对象是一系列属性的集合,和其他语言里的散列表结果类似。

两个创建简单对象并设置属性的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
//创建一个新的Object对象
var obj=new Object();
obj.val=5;
obj.click=function(){
alert("hello");
};
//这是一段等价代码,用{…}简写方式,结合键值对来定义属性
var obj={
val:5,
click:function() {
alert("hello");
}
};

Javascript里任何函数都可以被实例化为一个对象。

1
2
3
4
5
6
7
8
9
10
function User(name){
this.name=name;
}
var me=new User("My Name");
alert(me.name=="My Name");
alert(me.constructor == User);

User("Test");
//上下文对象没有设定,默认为全局的'window'对象
alert(window.name=="Test");

以下代码展示了constructor属性的使用,这一个属性在每个对象中都存在,并一直指向创建它的函数。这样就可以有效复制对象,用同一个基类创建对象并赋予不同的属性。

1
2
3
4
5
6
7
8
// User对象
function User(){}
// 创建一个User对象
var me = new User();
// 还是创建一个新的User对象(用前一个对象的constructor引用来创建)
var you = new me.constructor();
// 两个对象的constructor实质上一致
alert(me.constructor == you.constructor);

1、公共方法
要实现这种在对象的每个实例中都可以使用的公共方法,必须了解一个叫prototype的属性,这个属性包含了一个对象,该对象可以作为所有新副本的基引用(base reference)。本质上说,所有对象原型的属性都能在该对象的每个实例中找到。

因为对象的原型仍然是对象,和其它对象一样,可以给他们添加新的属性。给原型添加属性的结果是由该原型实例化的每个对象都会获得这些属性。

1
2
3
4
5
6
7
8
9
10
function User(name,age){
this.name=name;
}

User.prototype.getName=funciton(){
return this.name;
};

var user=new User(“Bob”);
alert(user.getName()==”Bob”);

2、私有方法
定义在构造函数内。私有方法和私有变量只允许其它的私有方法、私有变量和特权方法访问。这种方法可以定义一些只让对象内部访问,外部访问不到的代码。

3、特权方法
在构造函数中声明一个公共的方法,用一个公共属性引用这个方法,然后在这个方法内访问私有变量。如下:

1
2
3
4
5
6
function User(name, age){
var year = (new Date()).getFullYear()-age;
this.getYearBorn = function(){
return year;
};
}

可以看到,function(){ return year}使用了year这个私用变量,然后这个函数被this.getYearBorn引用,相当于getYearBorn是一个公共方法,单它能访问私有属性(可以访问私有变量这个就是它的特权)。

特权方法是动态生成的,因为它们是在运行时才添加到对象中的(在构造函数中),而不是在代码第一次编译时就已经生成的。

动态生成方法的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function User(properties){
for(var i in properties){
(
function(which){
var p=i;
//所谓的特权方法
which[“get”+p]=function() {
return properties[p];
};
//所谓的特权方法
which[‘set’+p]=function(val) {
properties[p]=val;
};
}
)(this); //自执行函数,携带上下文信息
}
}

这段代码根据传入的产生为User动态生成对应的Get和Set方法。

4、静态方法
类的方法:类名+”.”+字段,而对象的方法通过原型实现:this+”.”+字段 或 类名.prototype.字段。

坚持原创技术分享,您的支持将鼓励我继续创作!