JS 面向对象的小杂碎

封装:通过将一个方法或者属性声明为私有的,可以让对象的实现细节对其他对象保密以降低对象间的耦合程度,可以保持数据的保证性并对其修改方式加以约束,这样可以使代码更加可靠,更加易于调试。封装是面向对象的设计的基石。。。

但是javascript不具备将成员声明为公用或私用的任何内部机制,所以我们只能自己想办法实现这种特征。

私有属性和方法:函数有作用域,在函数内用var声明的变量在函数外部是无法访问的,私有属性和方法本质就是你希望在对象外部无法访问的变量。

特权属性和方法:创建属性和方法时使用的this关键字,因为这些方法定义在构造函数的作用域中,所以他们可以访问到私有的属性跟方法,只有那些需要直接访问私有成员的方法才应该呗设计为特权方法。

公用属性和方法:直接在prototype上定义的属性跟方法,不可以访问构造器内的私有成员,可以访问特权成员,子类会继承所有的共有方法跟属性。

共有静态属性跟方法:最好的理解方式就是把它想象成一个命名空间,实际上相当于把构造器作为一个命名空间来用。

// 封装

var _packaging = function() {
    //私有属性和方法
    var name = 'Darren';
    var method = function() {

    };
    // 特权属性和方法
    this.title = 'Javascritp';
    this.getName = function() {return name; };
};

// 共有属性跟方法
_packaging.prototype = {
    init: function() {}
};

// 共有静态属性跟方法
_packaging._name = 'Darren';
_packaging.alertName = function() {alert(_packaging._name);};

继承:在javascript中实现继承有两种方式:类式继承跟原型式继承。例子:

/* -- 类式继承 -- */
   //先声明一个超类
   function Person(name){
     this.name = name;
   }
  //给这个超类的原型对象上添加方法 getName 
   Person.prototype.getName = function(){
      return this.name;
   }
   //实例化这个超类
  var a = new Person('Darren1')
   alert(a.getName());
   //再声明类
   function Programmer(name,sex){
      //这个类中要调用超类Person的构造函数,并将参数name传给它
     Person.call(this,name);
      this.sex = sex;
   }
   //这个子类的原型对象等于超类的实例
   Programmer.prototype = new Person();
   //因为子类的原型对象等于超类的实例,所以prototype.constructor这个方法也等于超类构造函数,你可以自己测试一下,如果没这一步,alert(Programmer.prototype.constructor),这个是Person超类的引用,所以要从新赋值为自己本身
   Programmer.prototype.constructor = Programmer;
   //子类本身添加了getSex 方法
   Programmer.prototype.getSex = function(){
      return this.sex;
   }
  //实例化这个子类
   var _m = new Programmer('Darren2','male');
   //自身的方法
  alert(_m.getSex());
   //继承超类的方法
   alert(_m.getName());

/* -- 原型式继承 -- */
   //clone()函数用来创建新的类Person对象
   var clone = function(obj){
    var _f = function(){};
      //这句是原型式继承最核心的地方,函数的原型对象为对象字面量
      _f.prototype = obj; 
      return new _f;
   }
  //先声明一个对象字面量
  var Person = {
      name:'Darren',
      getName:function(){
         return this.name;
      }
   }
   //不需要定义一个Person的子类,只要执行一次克隆即可
   var Programmer = clone(Person);
   //可以直接获得Person提供的默认值,也可以添加或者修改属性和方法
   alert(Programmer.getName())
   Programmer.name = 'Darren2'
   alert(Programmer.getName())
 
   //声明子类,执行一次克隆即可
   var Someone = clone(Programmer);

你可能感兴趣的:(JS 面向对象的小杂碎)