javaScript循序渐进(4)

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } -->

面向对象基础

JavaScript 是完全面向对象的语言。所以不可能以非面向对象的方法来使用。

对象( Object

从最基本的层次上说,对象是一系列属性的集合,和其他语言里的散列表结构类似。

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

创建一个新的 Object 对象,存放在‘ obj’ 变量中

var obj= new Object();

给其设置一些属性

obj.val=5;

obj.click=function(){alert("hello zxr");};

下边是一段等价代码,用 { 。。。 } 简写方式,结合键值对( key/value pair )来定义属性

var obj={

用键值对方式来设置属性名和属性值

val:5,

click: function(){

alert("hello zxr");

}

};

对象的创建

JavaScript 并没有类( class )的概念。 JavaScript 里对象本身可以用来创建( create )新对象,而对象也可以继承自其它对象。这个概念称为原型化集成( prototypal inheritance .

不管 JavaScript 使用何种对象方案,首先还是应该有一种创建新对象的方法。 javascript 的做法是,任何函数都可以被实例化为一个对象。

例如:简单对象的创建和使用

一个简单的函数,接受名称并将其存入当前上下文中

function User(name){

this.name = name;

}

指定名称来创建该函数的一个新对象

var me = new User("zxr");

我们可以看到,这个对象的名称被设为自身的 name 属性了

alert(me.name == "zxr");

而且这是 User 对象的一个实例

alert(me.constructor == User);

现在,既然 User() 不过是个函数,如果只把它作为函数来使用又如何呢?

User ("wyl");

因为他的‘ this’ 上下文对象未曾设定,所以默认为全局的‘ window’ 对象,也就是说 window.name 等于提供的这个名字

alert(window.name == "wyl");

 

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

例如:使用 constructor 属性的例子

创建一个新的简单的 User 对象

function User(){}

创建一个 User 对象

var me = new User();

还是创建一个新的 User 对象(用前一个对象的 constructor 引用来创建)

var you = new me.constructor();

你可以发现这两个对象的 constructor 实质是一致的

alert(me.constructor == you.constructor);

现在我们知道如何创建简单对象了,是时候添加一些让对象更有用的东西了 --- 上下文相关方法( contextual method )和属性。

 

公共方法( public method

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

因为对象的原型仍然是对象,和其他任何对象一样,你也可以给它们添加新的属性。给原型添加属性的结果是由该原型实例化的每个对象都会获得这些属性,也就使这些属性公有化了(能被所有对象访问)。

例如:对象的方法通过 prototype 对象添加的例子

创建一个新的 User 构造函数

function User(name, age){

this.name = name;

this.age = age;

}

将一个新的函数添加到此对象的 prototype 对象中

User.prototype.getName = function(){

return this.name;

};

并再给此 prototype 对象添加一个函数,注意其上下文是实例化后的对象

User.prototype.getAge = function(){

return this.age;

};

实例化一个新的 User 对象

var user = new User("zxr",20);

可以看到我们添加的这两个属性都在刚才创建的对象中,并且有合适的上下文

alert(user.getName()=="zxr");

alert(user.getAge()==20);

 

私有方法( private method

私有方法和私有变量只允许其他的私有方法、私有变量和特权方法访问。

这种方法可以定义一些只让对象内部访问,而外部访问不到的代码。

参考 JavaScript 文章一览: http://javascript.crockford.com/

参考 Private Members in JavaScript 一文: http://javascript.crockford.com/private.html

例如:只能由构造函数访问的私有方法的例子

表示教室的一个对象构造函数

function Classroom(students, teacher){

用于显示所有班上学生的私有方法

function disp(){

alert(this.names.join(", "));

}

将班级数据存入公共对象属性中

this.students = students;

this.teacher = teacher;

调用私有方法来显示错误

disp();

}

创建一个新的 classroom 对象

var class = new Classroom(["John","Bob"],"Mr.Smith");

调用 disp 方法会失败,因为他不是该对象的公共属性

class.disp();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值