- 浏览: 581919 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
smilezhouwei:
请问CruiseControl在加载jar包时,由于jar包过 ...
修改CruiseControl的端口 -
zengxuefei:
不起作用啊,有bug
Flex+Java多文件上传 -
lzeus:
模仿的tomcat源码吧?
java事件处理机制(自定义事件)【转】 -
yangbobestone:
...
FreeMarker整合Struts2 -
fddjxllren:
那是因为你没配置事务,楼主的那个主要是针对事务的写法
Spring2.5+JUnit4单元测试
类变量/类方法/实例变量/实例方法
先补充一下以前写过的方法:
在javascript中,所有的方法都有一个call方法和apply方法.这两个方法可以模拟对象调用方法.它的第一个参数是对象,后面的
参数表示对象调用这个方法时的参数(ECMAScript specifies two methods that are defined for all functions, call()
and apply(). These methods allow you to invoke a function as if it were a method of some other object. The first
argument to both call() and apply() is the object on which the function is to be invoked; this argument becomes
the value of the this keyword within the body of the function. Any remaining arguments to call() are the values
that are passed to the function that is invoked).比如我们定义了一个方法f(),然后调用下面的语句:
f.call(o, 1, 2);
作用就相当于
o.m = f;
o.m(1,2);
delete o.m;
举个例子:
- function Person(name,age) { //定义方法
- this.name = name;
- this.age = age;
- }
- var o = new Object(); //空对象
- alert(o.name + "_" + o.age); //undefined_undefined
- Person.call(o,"sdcyst",18); //相当于调用:o.Person("sdcyst",18)
- alert(o.name + "_" + o.age); //sdcyst_18
- Person.apply(o,["name",89]);//apply方法作用同call,不同之处在于传递参数的形式是用数组来传递
- alert(o.name + "_" + o.age); //name_89
function Person(name,age) { //定义方法 this.name = name; this.age = age; } var o = new Object(); //空对象 alert(o.name + "_" + o.age); //undefined_undefined Person.call(o,"sdcyst",18); //相当于调用:o.Person("sdcyst",18) alert(o.name + "_" + o.age); //sdcyst_18 Person.apply(o,["name",89]);//apply方法作用同call,不同之处在于传递参数的形式是用数组来传递 alert(o.name + "_" + o.age); //name_89
---------------------------------
实例变量和实例方法都是通过实例对象加"."操作符然后跟上属性名或方法名来访问的,但是我们也可以为类来设置方法或变量,
这样就可以直接用类名加"."操作符然后跟上属性名或方法名来访问.定义类属性和类方法很简单:
- Person.counter = 0; //定义类变量,创建的Person实例的个数
- function Person(name,age) {
- this.name = name;
- this.age = age;
- Person.counter++; //没创建一个实例,类变量counter加1
- };
- Person.whoIsOlder = function(p1,p2) { //类方法,判断谁的年龄较大
- if(p1.age > p2.age) {
- return p1;
- } else {
- return p2;
- }
- }
- var p1 = new Person("p1",18);
- var p2 = new Person("p2",22);
- alert("现在有 " + Person.counter + "个人"); //现在有2个人
- var p = Person.whoIsOlder(p1,p2);
- alert(p.name + "的年龄较大"); //p2的年龄较大
Person.counter = 0; //定义类变量,创建的Person实例的个数 function Person(name,age) { this.name = name; this.age = age; Person.counter++; //没创建一个实例,类变量counter加1 }; Person.whoIsOlder = function(p1,p2) { //类方法,判断谁的年龄较大 if(p1.age > p2.age) { return p1; } else { return p2; } } var p1 = new Person("p1",18); var p2 = new Person("p2",22); alert("现在有 " + Person.counter + "个人"); //现在有2个人 var p = Person.whoIsOlder(p1,p2); alert(p.name + "的年龄较大"); //p2的年龄较大
prototype属性的应用:
下面这个例子是根据原书改过来的.
假设我们定义了一个Circle类,有一个radius属性和area方法,实现如下:
- function Circle(radius) {
- this.radius = radius;
- this.area = function() {
- return 3.14 * this.radius * this.radius;
- }
- }
- var c = new Circle(1);
- alert(c.area()); //3.14
function Circle(radius) { this.radius = radius; this.area = function() { return 3.14 * this.radius * this.radius; } } var c = new Circle(1); alert(c.area()); //3.14
假设我们定义了100个Circle类的实例对象,那么每个实例对象都有一个radius属性和area方法,
实际上,除了radius属性,每个Circle类的实例对象的area方法都是一样,这样的话,我们就可以
把area方法抽出来定义在Circle类的prototype属性中,这样所有的实例对象就可以调用这个方法,
从而节省空间.
- function Circle(radius) {
- this.radius = radius;
- }
- Circle.prototype.area = function() {
- return 3.14 * this.radius * this.radius;
- }
- var c = new Circle(1);
- alert(c.area()); //3.14
function Circle(radius) { this.radius = radius; } Circle.prototype.area = function() { return 3.14 * this.radius * this.radius; } var c = new Circle(1); alert(c.area()); //3.14
现在,让我们用prototype属性来模拟一下类的继承:首先定义一个Circle类作为父类,然后定义子类
PositionCircle.
- function Circle(radius) { //定义父类Circle
- this.radius = radius;
- }
- Circle.prototype.area = function() { //定义父类的方法area计算面积
- return this.radius * this.radius * 3.14;
- }
- function PositionCircle(x,y,radius) { //定义类PositionCircle
- this.x = x; //属性横坐标
- this.y = y; //属性纵坐标
- Circle.call(this,radius); //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的
- //radius属性
- }
- PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类
- var pc = new PositionCircle(1,2,1);
- alert(pc.area()); //3.14
- //PositionCircle类的area方法继承自Circle类,而Circle类的
- //area方法又继承自它的prototype属性对应的prototype对象
- alert(pc.radius); //1 PositionCircle类的radius属性继承自Circle类
- /*
- 注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象,
- 因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属
- 性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出
- 的是Circ.
- */
- alert(pc.constructor); //Circle
- /*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类
- 的constructor属性
- */
- PositionCircle.prototype.constructor = PositionCircle
- alert(pc.constructor); //PositionCircle
function Circle(radius) { //定义父类Circle this.radius = radius; } Circle.prototype.area = function() { //定义父类的方法area计算面积 return this.radius * this.radius * 3.14; } function PositionCircle(x,y,radius) { //定义类PositionCircle this.x = x; //属性横坐标 this.y = y; //属性纵坐标 Circle.call(this,radius); //调用父类的方法,相当于调用this.Circle(radius),设置PositionCircle类的 //radius属性 } PositionCircle.prototype = new Circle(); //设置PositionCircle的父类为Circle类 var pc = new PositionCircle(1,2,1); alert(pc.area()); //3.14 //PositionCircle类的area方法继承自Circle类,而Circle类的 //area方法又继承自它的prototype属性对应的prototype对象 alert(pc.radius); //1 PositionCircle类的radius属性继承自Circle类 /* 注意:在前面我们设置PositionCircle类的prototype属性指向了一个Circle对象, 因此pc的prototype属性继承了Circle对象的prototype属性,而Circle对象的constructor属 性(即Circle对象对应的prototype对象的constructor属性)是指向Circle的,所以此处弹出 的是Circ. */ alert(pc.constructor); //Circle /*为此,我们在设计好了类的继承关系后,还要设置子类的constructor属性,否则它会指向父类 的constructor属性 */ PositionCircle.prototype.constructor = PositionCircle alert(pc.constructor); //PositionCircle
发表评论
-
是否包含中文
2009-06-25 16:45 1025//是否包含中文 function isCh ... -
JS时分秒组件
2009-06-16 17:13 2160setTime.js文件内容如下: ... -
Javascript判断是否为正整数
2009-06-04 16:38 2439//判断是否为正整数 function isInteger( ... -
Javascript时间比较
2009-06-04 16:38 1635//时间比较 function compareTime(ti ... -
Javascript日期比较
2009-06-04 16:38 1572//日期比较 function compareDate(da ... -
清除下拉列表
2009-04-13 16:25 1149//清除下拉列表 function clearSelect ... -
iframe自适应高度
2009-04-01 20:58 969以下方法只适合在同一域中 <iframe wid ... -
文本框默认值
2009-03-31 16:20 1419<input name="keyword&qu ... -
javascript面向对象技术基础(六)
2009-03-13 14:36 1072作用域、闭包、模拟私 ... -
javascript面向对象技术基础(四)
2009-03-13 14:33 919类、构造函数、原型先来说明一点:在上面的内容中提到,每一个函 ... -
javascript面向对象技术基础(三)
2009-03-13 14:32 1159函数javascript函数相信大家都写过不少了,所以我们这 ... -
javascript面向对象技术基础(二)
2009-03-13 14:31 1022数组我们已经提到过,对象是无序数据的集合,而数组则是有序数据 ... -
javascript面向对象技术基础(一)
2009-03-13 14:30 1402看了很多介绍javascript ... -
JS验证金额的正则表达式
2009-02-25 18:01 11182function isDigit(s) { var patr ... -
推荐一下树Tree组件
2008-12-02 16:32 1521http://dhtmlx.com/docs/products ... -
DTree树
2008-10-06 17:38 1316DTree树不错,使用起来很方便. 可以到http://des ... -
子窗体创建以及子窗体父窗体之间的通信(自己整理)
2008-09-10 22:55 1560父窗体 <!DOCTYPE HTML PUB ... -
子窗体创建以及子窗体父窗体之间的通信
2008-09-10 22:48 58961、Javascript弹出子窗口 可以通过多种方式实现, ... -
单元格背景色鼠标响应
2008-07-17 22:17 1104<!DOCTYPE html PUBLIC " ... -
禁止文件上传时输入名称
2007-10-09 11:48 1254<input type="file" ...
相关推荐
JavaScript是一种广泛应用于...以上是JavaScript面向对象技术的一些基础知识。通过理解并熟练运用这些概念,开发者能够编写出更清晰、更易于维护的代码。对于JavaScript初学者来说,掌握这些基础是进阶学习的关键步骤。
JavaScript 面向对象技术是编程中的核心概念,它允许我们以更加接近人类思维的方式组织代码,通过模拟现实世界中的对象来实现复杂的功能。本文将深入探讨JavaScript中的面向对象技术,包括对象、数组、函数、类、...
JavaScript面向对象技术在实现树形控件中扮演着至关重要的角色。树形控件是一种用于展示层次型数据的用户界面元素,它具有扩展和折叠功能,可以在有限的空间内清晰地展示大量的信息,使得数据间的层级关系一目了然。...
《JavaScript内核系列》和《JavaScript面向对象基础》这两本书是深入理解JavaScript编程的重要资源。JavaScript,作为一种广泛应用于Web开发的脚本语言,其内核和面向对象特性是开发者必须掌握的基础知识。以下是对...
JavaScript是一种基于原型的面向对象编程语言,它的面向对象技术基础包括对象、数组、原型、作用域、闭包以及模拟私有变量等核心概念。下面将详细介绍这些知识点。 **1. 对象与数组** 在JavaScript中,对象是键值...
总的来说,JavaScript面向对象技术提供了一种高效且灵活的方式来实现树形控件。通过合理地组织对象和方法,可以构建出适应不同场景、具有良好扩展性的树形数据结构,满足用户界面的需求。尽管JavaScript的OOP模型与...
最后,`demo.html`可能是一个示例网页,展示了如何在实际项目中使用上述的JavaScript面向对象编程技术。它可能包含了HTML结构,以及引入`JSLogger.js`的脚本,通过创建和操作对象来展示其功能。 总的来说,这篇博客...
在这个名为"小游戏JavaScript面向对象编程贪吃蛇"的项目中,我们将深入探讨如何利用JavaScript的面向对象特性来实现经典的贪吃蛇游戏。 贪吃蛇游戏的核心概念包括蛇、食物、边界和游戏状态。在JavaScript中,我们...
自定义对象是JavaScript面向对象编程的核心,可以通过构造函数或原型链来实现: - 构造函数方式:定义一个函数作为构造器,使用new关键字创建实例。 ```javascript function Person(name, age) { this.name = name...
本文将深入浅出地讲解JavaScript中的面向对象技术基础,包括对象、数组、函数、类、构造函数以及原型等方面的知识。 首先,让我们来看看对象和数组。在JavaScript中,对象是键值对的集合,这些键通常是字符串,对应...
看了很多介绍javascript面向对象技术的文章,很晕.为什么?不是因为写得不好,而是因为太深奥.
本文将深入探讨如何利用JavaScript的面向对象技术来构建这些复杂的应用程序。 面向对象编程(OOP)是软件开发中的一个重要概念,它通过类和对象来抽象现实世界中的实体,提供了一种组织代码的有效方式。在...
本教程针对那些对javascript语言有一定的了解,从事过web开发,并且在实际中或多或少地使用过javascript的开发和技术人员 javascript语言基础的语法在此就直接略过,不做介绍 通过本教程的学习,学习者应该了解...
JavaScript的原型和原型链是其独特之处,它允许对象之间继承属性和方法,实现面向对象编程。此外,ES6(ECMAScript 2015)引入的类和模块系统使得代码组织更加清晰,更接近传统的面向对象语言。 JavaScript还具有...
在这个专题中,我们将深入探讨JavaScript的基础语法,面向对象的实现,以及设计模式在JavaScript中的应用。 **一、JavaScript基础语法** JavaScript的基础语法包括变量声明、数据类型、运算符、流程控制和函数等...