JS面向对象基础

时间:2023-03-10 01:02:08
JS面向对象基础

以往写代码仅仅是为了实现特定的功能,后期维护或别人重用的时候,困难很大。

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

)静态方法,类似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);//静态的