如何用javascript创建类?

smalle 2004-09-27 07:16:58
在VBscript中可以用class来创建类,类里面可以有自己的函数和属性,但javascript中好像没有类这个东西只有直接写个function来创建,但这样就没有类自己的函数和属性了,有没有人知道怎么用javascript来创建类啊?
...全文
406 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
i594yangyang 2004-12-23
  • 打赏
  • 举报
回复
构造函数是一个函数,调用它来例示并初始化特殊类型的对象。可以使用 new 关键字来调用一个构造函数。下面给出了使用构造函数的新示例。

var myObject = new Object(); // 创建没有属性的通用对象。
var myBirthday = new Date(1961, 5, 10); // 创建一个 Date 对象。
var myCar = new Car(); // 创建一个用户定义的对象,并初始化其属性。
通过构造函数将一个参数作为特定的 this 关键字的值传递给新创建的空对象。然后构造函数负责为新对象执行适应的初始化(创建属性并给出其初始值)。完成后,构造函数返回它所构造的对象的一个参数。

编写构造函数
可以使用 new 运算符结合像 Object()、Date() 和 Function() 这样的预定义的构造函数来创建对象并对其初始化。面向对象的编程其强有力的特征是定义自定义构造函数以创建脚本中使用的自定义对象的能力。创建了自定义的构造函数,这样就可以创建具有已定义属性的对象。下面是自定义函数的示例(注意 this 关键字的使用)。

function Circle (xPoint, yPoint, radius) {
this.x = xPoint; // 圆心的 x 坐标。
this.y = yPoint; // 圆心的 y 坐标。
this.r = radius; // 圆的半径。
}
调用 Circle 构造函数时,给出圆心点的值和圆的半径(所有这些元素是完全定义一个独特的圆对象所必需的)。结束时 Circle 对象包含三个属性。下面是如何例示 Circle 对象。

var aCircle = new Circle(5, 11, 99);
使用原型来创建对象
在编写构造函数时,可以使用原型对象(它本身是所有构造函数的一个属性)的属性来创建继承属性和共享方法。原型属性和方法将按引用复制给类中的每个对象,因此它们都具有相同的值。可以在一个对象中更改原型属性的值,新的值将覆盖默认值,但仅在该实例中有效。属于这个类的其他对象不受此更改的影响。下面给出了使用自定义构造函数的示例,Circle(注意 this 关键字的使用)。

Circle.prototype.pi = Math.PI;
function ACirclesArea () {
return this.pi * this.r * this.r; // 计算圆面积的公式为 Πr²。
}
Circle.prototype.area = ACirclesArea; // 计算圆面积的函数现在是 Circle Prototype 对象的一个方法。
var a = ACircle.area(); // 此为如何在 Circle 对象上调用面积函数。
使用这个原则,可以给预定义的构造函数(都具有原型对象)定义附加属性。例如,如果想要能够删除字符串的前后空格(与 VBScript 的 Trim 函数类似),就可以给 String 原型对象创建自己的方法。

// 增加一个名为 trim 的函数作为
// String 构造函数的原型对象的一个方法。
String.prototype.trim = function()
{
// 用正则表达式将前后空格
// 用空字符串替代。
return this.replace(/(^\s*)|(\s*$)/g, "");
}

// 有空格的字符串
var s = " leading and trailing spaces ";

// 显示 " leading and trailing spaces (35)"
window.alert(s + " (" + s.length + ")");

// 删除前后空格
s = s.trim();
// 显示"leading and trailing spaces (27)"
window.alert(s + " (" + s.length + ")");


--------------------------------------------------------------------------------

© 2001 Microsoft Corporation. 保留所有权利。

whnnet 2004-09-28
  • 打赏
  • 举报
回复
支持:
ice_berg16(寻梦的稻草人)
smalle 2004-09-28
  • 打赏
  • 举报
回复
谢谢 ice_berg16(寻梦的稻草人) ( ) 了结帐
ice_berg16 2004-09-27
  • 打赏
  • 举报
回复
function student()
{
this.name = "aaa";
this.age = 20;
this.gender = "male";
this.setName = function (name) {this.name=name;};
}
function teacher()
{
this.name = "aaa";
this.age = 20;
this.gender = "male";
this.setName = function (name) {this.name=name;};
}
a = new student();
document.write(a.name);
a.setName("bbb");
document.write(a.name);
b = new teacher();
document.write(b.name);
b.setName("ccc");
document.write(b.name);

输出aaabbbaaaccc
可见a和b是两个完全独立的对象。它们拥有同名方法setName,但互不影响.
cxz7531 2004-09-27
  • 打赏
  • 举报
回复
使用下列方式定义类,难道不行吗?不同类的f方法自然是不同的
this.f=function (nextCoord) { .... }
smalle 2004-09-27
  • 打赏
  • 举报
回复
在VBSCRIPT中是这样的:
class obj1
public function a()
end function
end class

class obj2
public function a()
end function
end class


obj1与obj2中的a()都是独立的,互不影响。
cxz7531 2004-09-27
  • 打赏
  • 举报
回复
构造函数本身就相对于类的定义,不过这里的类跟一般高级语言的类有很大差异,他不能直接继承,要继承的话,必须先把他的原型对象定义为父类的实例
----
类Coord
function Coord(x,y) {
this.x =x;
this.y =y;
this.jli=distance;
this.str=toStr;
}
function distance(nextCoord) {
var dx = this.x - nextCoord.x;
var dy = this.y - nextCoord.y;
return Math.sqrt( dx * dx + dy * dy);
}
function toStr() {
return '(' + Math.round(this.x) + ',' + Math.round(this.y) +')';
}
smalle 2004-09-27
  • 打赏
  • 举报
回复
这个我以前看过很多次了。问题是,如果有两个对象,每个对象都有相同的方法如何定义?我想定义对象内部的函数,必须通过对象来访问,不能直接引用该方法。
如obj1和obj2都有一个方法叫a();分别处理不同的事情,那么怎么写呢?
ice_berg16 2004-09-27
  • 打赏
  • 举报
回复
使用function 就可以了啊
function student()
{
this.name = "aaa";
this.age = 20;
this.gender = "male";
this.setName = function (name) {this.name=name;};
}
cybernaute 2004-09-27
  • 打赏
  • 举报
回复
创建自己的对象
要创建自己的对象实例,必须首先为其定义一个构造函数。构造函数创建一个新对象,赋予对象属性,并在合适的时候赋予方法。例如,下面的示例为 pasta 对象定义了构造函数。注意 this 关键字的使用,它指向当前对象。

// pasta 是有四个参数的构造器。
function pasta(grain, width, shape, hasEgg)
{
// 是用什么粮食做的?
this.grain = grain;

// 多宽?(数值)
this.width = width;

// 横截面形状?(字符串)
this.shape = shape;

// 是否加蛋黄?(boolean)
this.hasEgg = hasEgg;
}
定义了对象构造器后,用 new 运算符创建对象实例。

var spaghetti = new pasta("wheat", 0.2, "circle", true);
var linguine = new pasta("wheat", 0.3, "oval", true);
可以给对象实例添加属性以改变该实例,但是用相同的构造器生成的其他对象定义中并不包括这些属性,而且除非你特意添加这些属性那么在其他实例中并不显示出来。如果要将对象所有实例的附加属性显示出来,必须将它们添加到构造函数或构造器原型对象(原型在高级文档中讨论)中。

// spaghetti 的附加属性。
spaghetti.color = "pale straw";
spaghetti.drycook = 7;
spaghetti.freshcook = 0.5;

var chowFun = new pasta("rice", 3, "flat", false);
// chowFun 对象或其他现有的 pasta 对象
// 都没有添加到 spaghetti 对象
// 的三个新属性。


// 将属性‘foodgroup’加到 pasta 原型对象
// 中,这样 pasta 对象的所有实例都可以有该属性,
// 包括那些已经生成的实例。
pasta.prototype.foodgroup = "carbohydrates"

// 现在 spaghetti.foodgroup、chowFun.foodgroup,等等
// 均包含值“carbohydrates”。
在定义中包含方法
可以在对象的定义中包含方法(函数)。一种方法是在引用别处定义的函数的构造函数中添加一个属性。例如,下面的示例扩充上面定义的 pasta 构造函数以包含 toString 方法,该方法将在显示对象的值时被调用。

// pasta 是有四个参数的构造器。
// 第一部分与上面相同。
function pasta(grain, width, shape, hasEgg)
{
// 用什么粮食做的?
this.grain = grain;

// 多宽?(数值)
this.width = width;

// 横截面形状?(字符串)
this.shape = shape;

// 是否加蛋黄?(boolean)
this.hasEgg = hasEgg;

// 这里添加 toString 方法(如下定义)。
// 注意在函数的名称后没有加圆括号;
// 这不是一个函数调用,而是
// 对函数自身的引用。
this.toString = pastaToString;
}

// 实际的用来显示 past 对象内容的函数。
function pastaToString()
{
// 返回对象的属性。

return "Grain: " + this.grain + "\n" +
"Width: " + this.width + "\n" +
"Shape: " + this.shape + "\n" +
"Egg?: " + Boolean(this.hasEgg);
}

var spaghetti = new pasta("wheat", 0.2, "circle", true);
// 将调用 toString() 并显示 spaghetti 对象
// 的属性(需要Internet 浏览器)。
window.alert(spaghetti);
====================================
来源:jscript语言参考
相关推荐
发帖
JavaScript

8.7w+

社区成员

Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
帖子事件
创建了帖子
2004-09-27 07:16
社区公告
暂无公告