以往写代码仅仅是为了实现特定的功能,后期维护或别人重用的时候,困难很大。
Javascript作为完全面向对象的语言,要写出最优的代码,需要理解对象是如何工作的。
1. 对象是javascript的基础,对象是一系列属性的集合,类似其他语言的散列表。
如下两个创建对象,并实现属性的例子是相同的。
var obj = new Object();
//给对象Obj设置一系列的属性
obj.name = "rxm";
obj.getAge = function()
{ return (new Date()).getFullYear() - 1986; };
//---------------------------------------
//结合键值对来重写对象
var obj = {
name: "rxm",
getAge: function() { return (new Date()).getFullYear() - 1986; }
};
2. Javascript中,对象本身可以用来创建新对象,对象也可以继承自其他对象,这称为“原型化继承”。
<script language="javascript" type="text/javascript">
function User(name) {
this.name = name;
}
var my = new User("rxm");
var you = new my.constructor("cwr");
alert(my.name == "rxm"); //true
alert(typeof my == typeof you); //true
User("bj"); //对象上下文未设定,默认为window.
alert(window.name); //bj
</script>
1)公共方法
要实现在每个实例中都用到的公共方法,需了解prototype(原型)属性,这个属性包含了一个对象,此对象可以作为所有新副本的基引用。
function User(name, age) {
this.name = name;
this.age = age;
}
User.prototype.getName = function() {
return this.name;
}
User.prototype.getAge = function() {
return this.age;
}
var my = new User("rxm", 27);
alert(my.getAge()); //每个实例化的对象都可以访问prototype属性添加的属性
alert(my.getName());
2)私有方法
只能有构造函数访问的私有函数的例子:
function User(name, age) {
this.name = name;
this.age = age;
function getName() {
return this.name;
}
}
var my = new User("rxm", 27);
my.getName(); //调用失败[运行时错误: 对象不支持此属性或方法]
3)特权方法
指那些在处理对象私有变量的同时,允许用公共方式访问的方法。
function User(age) {
var year = (new Date()).getFullYear() - age;
this.getAge = function() {
return year;
}
}
var my = new User(27);
alert(my.getAge());//1986
alert(my.year);//我们无法访问对象的私有属性
动态生成代码的能力是不能小视的,能够根据运行时生成代码是十分的有用。
//创建一个新的用户对象,接收一个有许多属性的对象作为参数
function User(properties) {
//遍历每一个属性,设置读取器和设置器
for (var i in properties) {
(function(which) {
var p = i;
which["set" + p] = function(val) {
properties[p] = val;
}
which["get" + p] = function() {
return properties[p];
}
}
)(this);
}
}
var user = new User({
name:"rxm",
age:27 });
alert(user.name); //没有这么个属性
alert(user.getname()); //rxm 函数是动态生成的
alert(user.getage());//27
4)静态方法,类似C# static
function Person(name) {
this.name = name;
this.getname = function()
{ return "my name is " + this.name; };
}
Person.mouth = 1;
var my = new Person("rxm");
alert(my.getname());//实例的
alert(Person.mouth);//静态的