JS 面向对象的小杂碎
封装:通过将一个方法或者属性声明为私有的,可以让对象的实现细节对其他对象保密以降低对象间的耦合程度,可以保持数据的保证性并对其修改方式加以约束,这样可以使代码更加可靠,更加易于调试。封装是面向对象的设计的基石。。。
但是javascript不具备将成员声明为公用或私用的任何内部机制,所以我们只能自己想办法实现这种特征。
私有属性和方法:函数有作用域,在函数内用var声明的变量在函数外部是无法访问的,私有属性和方法本质就是你希望在对象外部无法访问的变量。
特权属性和方法:创建属性和方法时使用的this关键字,因为这些方法定义在构造函数的作用域中,所以他们可以访问到私有的属性跟方法,只有那些需要直接访问私有成员的方法才应该呗设计为特权方法。
公用属性和方法:直接在prototype上定义的属性跟方法,不可以访问构造器内的私有成员,可以访问特权成员,子类会继承所有的共有方法跟属性。
共有静态属性跟方法:最好的理解方式就是把它想象成一个命名空间,实际上相当于把构造器作为一个命名空间来用。
01 // 封装
02
03 var _packaging = function() {
04 //私有属性和方法
05 var name = 'Darren';
06 var method = function() {
07
08 };
09 // 特权属性和方法
10 this.title = 'Javascritp';
11 this.getName = function() {return name; };
12 };
13
14 // 共有属性跟方法
15 _packaging.prototype = {
16 init: function() {}
17 };
18
19 // 共有静态属性跟方法
20 _packaging._name = 'Darren';
21 _packaging.alertName = function() {alert(_packaging._name);};
继承:在javascript中实现继承有两种方式:类式继承跟原型式继承。例子:
view sourceprint?01 /* -- 类式继承 -- */
02 //先声明一个超类
03 function Person(name){
04 this.name = name;
05 }
06 //给这个超类的原型对象上添加方法 getName
07 Person.prototype.getName = function(){
08 return this.name;
09 }
10 //实例化这个超类
11 var a = new Person('Darren1')
12 alert(a.getName());
13 //再声明类
14 function Programmer(name,sex){
15 //这个类中要调用超类Person的构造函数,并将参数name传给它
16 Person.call(this,name);
17 this.sex = sex;
18 }
19 //这个子类的原型对象等于超类的实例
20 Programmer.prototype = new Person();
21 //因为子类的原型对象等于超类的实例,所以prototype.constructor这个方法也等于超类构造函数,你可以自己测试一下,如果没这一步,alert(Programmer.prototype.constructor),这个是Person超类的引用,所以要从新赋值为自己本身
22 Programmer.prototype.constructor = Programmer;
23 //子类本身添加了getSex 方法
24 Programmer.prototype.getSex = function(){
25 return this.sex;
26 }
27 //实例化这个子类
28 var _m = new Programmer('Darren2','male');
29 //自身的方法
30 alert(_m.getSex());
31 //继承超类的方法
32 alert(_m.getName());
view sourceprint?01 /* -- 原型式继承 -- */
02 //clone()函数用来创建新的类Person对象
03 var clone = function
相关新闻>>
- 发表评论
-
- 最新评论 更多>>