首页 > JavaScript > JavaScript 实例属性,实例方法,类属性,类方法
2009六月29

JavaScript 实例属性,实例方法,类属性,类方法

常规的面向对象程序里面一般会有如下四种可能的基本类型,分别是:实例属性、实例方法、类属性和类方法。

JavaScript虽然是“面向对象编程语言”,不过其并没有“类”的概念,所以也就没有以类为基础的继承机制。不过作者借鉴其他编程语言,将JavaScript打造为以原型对象为基础的继承机制,而不是以类为基础的继承机制。在JavaScript中用构造函数和原型对象模拟了类。

下面,就简单的在JavaScript中来模仿上述所说的四种基本类型。

实例属性

每个对象都有它自己单独的实例属性的副本,如果你给定N个类的实例化对象,那么实例属性的副本也就有N个。这里说的副本可不是魔兽的那个哈。嗯。

例如:人都有姓名,年龄,性别。这些都是自己独有的属性。即使别人的内容和你的一样,但是他们永远也不是你。

默认情况下,JavaScript中的任何对象属性都是实例属性。如果说的别扭点,但是专业一些的话就可以是:

JavaScript中的实例属性是那些在对象中用构造函数创建或初始化的属性。

//定义一个用户类
function User(name)
{
   this.name = name;
}
//老张是用户,名字就叫老张
var zhang = new User('zhang');
//老张今年25了,该娶妻了
zhang.age = 25;
//老李也是用户,名字就叫老李
var li = new User('li');
//老李今年才18
li.age = 18;

实例方法

实例方法是由特定对象或实例调用的。举个简单的例子来说,

老张是人,老张可以拿起扫帚打自己的儿子,“拿扫帚打”这是就是一个实例方法,你不能说“老李也是人”他就可以去打老张的儿子,他打自己的儿子可以,但是如果打老张的儿子,老张家父子俩就会弄残老李。就是这么一个样子。

PS:以上内容不涉及法律知识。嗯。

实例方法使用了this关键字来引用它们 要操作的对象或实例(this == 老张)。

1. 虽然一个类的任何实例都可以调用实例方法,但是并不意味着每个对象都像实例属性那样含有自己的专有方法副本。

2. 每个实例方法都是由类的所有实例共享的。

举个小例子:老张家的人,都是老张家这个类的实例化的对象。因为都姓张嘛。所以,老张家多了个电视(别管谁买的,充公),谁都可以看,并且这里不存在摇控器的概念。嗯。

给类定义一个实例方法,是通过把构造函数的原型对象中的一个属性设置为函数值实现的。

//定义一个实例方法,设置原型的属性为一匿名函数
User.prototype.getName = function(){return this.name;};
//由对象调用这个实例方法
alert(zhang.getName());

类属性

类属性是一个与类相关联的变量,而不是和类的每个实例相关联的变量(实例属性)。本质上说呢,类属性是全局变量,但是它们与一个类关联在一起,在JavaScript的名字空间中拥有一个逻辑位置,这样他们就不会被其他的同名属性覆盖。

举个例子:用户规定了,23岁才可以结婚。明天想开了,去TMD的吧,老子12就要结婚(当然这个数不让随便改的,嘿嘿),这个结婚年龄就可以被定义为类属性。和类打交道。只要你是用户就得23结婚。早了的不行,要罚款的。。

//结婚年龄,定义为构造函数的属性。嗯。
User.matrimonial_age   = 23;

类方法

类方法同类属性一样,是一个与类关联在一起的方法,而不是和类的实例关联在一起的方法(实例方法)

类方法不能通过一个特定对象调用,所以使用关键字this对它来说是没有意义的,因为this引用的是调用实例方法的对象。和类属性一样,类方法也是全局性的。因为类方法不是对探到无时蚝操作的,所以类方法更容易被认为是由类调用的方法。

要定义一个类方法,只需要用合适的函数作为构造函数的属性。

//比较两个用户的年龄,年龄大的赏老婆
function compareAgeForMatrimonial(user_a, user_b){
    var result = '';

    if(user_a.age  >= User.matrimonial_age)
    {
        result +=  user_a.name + "小崽子,可以结婚了";
    }
    if(user_b.age >= User.matrimonial_age)
    {
        result += user_b.name + "小崽子,可以结婚了";
    }
    if(user_a.age < User.matrimonial_age && user_b.age < User.matrimonial_age)
    {  
        result += "谁年龄都不够,把花姑娘留给小小子吧";
    }
    return result;
};
//把这个函数赋值给构造函数的一个属性
User.compareAgeForMatrimonial = compareAgeForMatrimonial;

延伸阅读
面向对象的JavaScript — 类设计

大家可以去上面的链接那里看一下《权威指南》这本书上的实例。

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/06/29/1012/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

7 Responses to “JavaScript 实例属性,实例方法,类属性,类方法”

  1. #1 LAONB 回复 | 引用 Post:2009-06-29 23:03

    你举的例子太 :roll: 了,很形象。
    那我猜JS冲突的时候肯能跟类重复有关吧。

    [回复]

  2. #2 Jutoy 回复 | 引用 Post:2009-06-30 11:08

    呃,我……我纯支持……这个太技术了…… :evil:

    [回复]

  3. #3 bolo 回复 | 引用 Post:2009-06-30 12:16

    var result = ”是什么意思?

    [回复]

  4. #4 simaopig 回复 | 引用 Post:2009-06-30 12:18

    @bolo
    定义变量 result 初始值为“空”。

    [回复]

  5. #5 小刀 回复 | 引用 Post:2009-07-01 15:51

    太深了,有点看不懂。

    [回复]

  6. #6 simaopig 回复 | 引用 Post:2009-07-01 15:58

    @小刀
    呵呵,看不懂就来捧个人场吧。呵呵。

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)