Javascript的类和原型

来源:互联网 发布:银行大劫案 知乎 编辑:程序博客网 时间:2024/06/05 23:48
1.在Javascript中,类的所有实例对象都是从同一个原型对象上继承属性。因此,原型对象是类的核心。

2. 使用关键字new来调用构造函数。使用new调用构造函数会自动创建一个新对象,因此构造函数本身只需初始化这个新对象的状态即可。调用构造函数的一个重要特征是,构造函数的prototype属性被用作新对象的原型。这意味着通过同一个构造函数创建的所有的对象都继承自一个相同的对象,因此它们都是同一个类的成员。

例 1-01:

/**
* 定义Person类,下面是Person类的构造函数,此时并没有创建并返回一个对象,仅仅是初始化
*/
function Person(name, age){
  this.name = name;
  this.age = age;
}

/**
* 所有的实例化对象都要继承这个原型对象,注意:属性的名字必须是prototype
*/
Person.prototype = {
  say: function(){  
    alert(this.name + "," + this.age);
  }
}

/**
* 实例化一个Person对象
*/
var dufu = new Person("Andy", 24);
dufu.say();

3. 注意:原型对象是类的唯一标识: 当且仅当两个对象继承自同一个原型对象时,它们才是属于同一个类的实例。而初始化对象的状态的构造函数则不能作为类的标识,两个构造函数的prototype属性可能指向同一个原型对象。那么这两个构造函数创建的实例是属于同一个类的。

4. 每一个Javascript函数都自动拥有prototype属性(Function.bind()放大返回的函数除外)。这个属性是一个对象, 这个对象包含一个不可枚举属性constructor。constructor属性的值是一个函数对象 : 

例 1-02:

var F = function(){ }; //这是一个函数对象
var p = F.prototype; //这是F相关联的原型对象
var c = p.constructor; //这是与原型相关联的函数
c === F; //true, 对于任意函数F.prototype.constructor == F

5. JavaScript中Java式的类继承: Javascript和Java的一个区别在于,JavaScript中的函数都是以值的形式出现的,方法和字段之间没有太大的区别。如果属性值是函数,那么这个属性就定义一个方法;否则,它只是一个普通的属性或者“字段”。但是我们依然可以用Javascript模拟出Java中的这四种类成员类型(实例字段,实例方法,类字段,类方法)。
     Javascript中定义一个类可以分为三步:
          (1) 先定义一个构造函数,并设置初始化新对象的实例属性
          (2) 给构造函数的prototype对象定义实例的方法。
          (3)给构造函数定义类字段和类属性。

6. 使用Object.seal() 函数可以锁定对象,阻止其属性被修改(阻止对象扩展),同时还将对象的所有属性将 configurable 特性设置为 false。需要注意的是,在JavaScript中,Object.freeze()可以祈祷同样的效果。

 例 1-03:
               /**
               * 定义一个构造函数用于测试Object.seal()的用法
               */
               function A(m, n){
                    this.m = m;
                    this.n = n;
               }
    
               var a = new A(22, 23); //实例化一个新的对象a
               Object.seal(a); //阻止修改现有属性的特性,并阻止添加新属性。
               a.x = 20; // 为对象a添加一个新的属性 x
               console.log(a.x); // undefined
0 0
原创粉丝点击