面向对象的学习
1、面向对象的三要素。
(1)封装。 (2)多态。 (3)继承。
1、 封装
在js中,重点在于访问权限。在其他原生支持面向对象语言中,一般支持public、protected、private三个关键字来控制访问权限,但在js中,我们只能依靠复杂的作用域关系来控制:
2、 继承
继承的实现,主要有2种方法:第一种是使用javascript本身的原型模型,通过给prototype赋值并改变其constructor属性来实现继承;第二种方法是不使用prototype,手动实现将父对象的所有属性方法深拷贝到子对象。比如A需要继承B,第一种写法可以:A.prototype=new B();A.prototype.constructor=A; 第二种写法可以写一个递归,或者使用jquery中的方法extend。另外,如果要实现多继承的话,prototype就真的好麻烦了(需要依次多个类,还要建空对象来接),第二种方法就比较简单,依次拷贝即可。一般这种继承为了找父类方便,可以在对象中加个属性,引用父类。
3、 多态
函数重载就不说了,都会,检查参数即可,很灵活。隐藏属性就是直接赋值undefined。需要注意的是,如果是打算继承B类的prototype,一定要建一个空对象来接,否则的话,你给类写方法的话,相当于直接修改了prototype,就算不写方法,你最后修改constructor时也会造成继承链错乱,接个空对象很容易:
2、设计一个三维向量类,并实现向量的加法、减法以及向量瑜标量的乘法和除法
实例代码:
class vector3: def __init__(self, x_ = 0, y_ = 0, z_ = 0): self.x = x_ self.y = y_ self.z = z_ def __add__(self, obj): return vector3(self.x+obj.x, self.y+obj.y, self.z+obj.z) def __sub__(self, obj): return vector3(self.x-obj.x, self.y-obj.y, self.z-obj.z) def __mul__(self, obj): return vector3(self.x*obj.x, self.y*obj.y, self.z*obj.z) def __pow__(self, obj): return vector3(self.y*obj.z-obj.y*self.z, self.z*obj.x-self.x*obj.z, self.x*obj.y-obj.x*self.y) def __str__(self): return str(self.x)+‘,‘+str(self.y)+‘,‘+str(self.z) v1 = vector3(1, 2, 3) v2 = vector3(0, 1, 2) print (v1 + v2) print (v1 - v2) print (v1 * v2) print (v1 ** v2)