js面向对象--PHP面向对象
面向对象:
面向对象就是通过函数封装得到的一个类(类的本质还是函数
- 每个类(函数)天生有一个prototype的属性,这个prototype又是一个对象,这个对象里有个constructor(构造函数)的属性,属性值是类本身。
- 我们所有new 一个类的时候,其实是调用它的构造函数。构造函数里的属性都是私有的,构造函数里的this都是实例对象。
- 每个对象天生有一个__proto__,指向类的原型。
-
function person(){}console.log(person.prototype==Function)var zhangsan = new person();console.log(zhangsan.__proto__==person.prototype)
zhangsan这个对象首先看name是私有的,是就直接使用,不是的就通过__proto__往他的类的prototype上查找,有就直接使用,没有就继续向上查找,直到查找到基类Object,没有就是undefined,有就直接使用。这种查找机制 叫原型链。
-
提到面向对象,大家的第一反应就是封装、继承和多态。对其做如下解释:
1. 封装
将数据和操作数据的方法捆绑在一起,对外隐藏,只提供可以操作的接口。
继承js
2. 原型继承 将父类的实例对象赋值给子类的原型;私有的公有的都继承为公有的。
2. call继承 call方法是函数/类天生自带的一个方法。将父类私有的继承为子类私有的。
3.冒充对象继承 将父类私有的和公有的都继承为子类私有的。 使用for in
for in 可以遍历对象的公有属性 fn 就是公有的
冒充对象继承的案例
function Person(name){this.name=name;}
Person.prototype.fn=function(){console.log(1)}
var p1=new Person("zhang")
function Son(){
this.age=56;
//this 是子类的实例对象
for(var key in p1){
this[key]=p1[key]
}
}
var s1=new Son;
console.log(s1)
4.混合继承 私有的继承为私有的 私有的和公有的再次继承为公有的。
Call继承和原型继承的结
5.组合继承 私有继承为私有 公有继承为公有
私有继承私有 借助call 公有继承为公有 不能是原型赋值给原型。因为原型是对象,是复合数据类型,是地址赋值给了前者,导致二者指向同一个原型。得克隆。
Js的克隆如何实现 var obj2= Object.create(obj1)
6.中间类继承
类:私有的,公有的。
3. 多态
Php是弱类型语言,没有多态这个概念,有重载。重载:子类和父类的方法名相同,子类会覆盖掉父类的方法,这就叫重载。
多态是强类型语言才有的,
PHP面向对象
面向对象是一种程序设计模式,简称oop
1,类 通过关键字class定义类,类名首字母要大写。
2,对象 是类的实例,通过new关键字,得到一个实例对象, new classname;
3,通过访问修饰符给类添加成员,
Pubic 添加的成员是公有的,在类内 类外 子类都可以去访问他。
Protected 受保护的,只能在类的里面和子类都可以去访问他。
Private 私有的,只能在类里面访问
如果成员前面没有加修饰符,默认是putblic
4,实例对象使用->访问类里面的成员。
对象->属性的时候,属性前面不加$符号。
构造函数, constructor
New 实例对象的本质,其实就是调用对应内的构造函数
$this 是类的实例对象,
析够函数
我们new实例的时候其实是调用构造函数,函数调用的时候会开辟内存空间,调用完之后会自动销毁。销毁前会自动调用,__destuct这个析构方法
继承extends
子类继承父类。 使用extends 关键字 子类继承父类中的属性和方法。
子类继承父类的属性和方法是有限继承,
Public public 修饰的属性和方法 子类都能继承
Protected protected 修饰的属性和方法,子类都可以继承。
Private Private 修饰的属性子类可以继承,private 修饰的方法子类不能继承。
静态属性/
使用static关键字定义的属性和方法,直接属于类,不会进入到类上
类如何防止静态属性,类名::静态属性 1.::范围解析操作符 2.静态属性前加$
静态方法的使用和静态属性一样
静态方法中不能使用$this关键字,$this是实例对象,而对象不能访问静态成员。
$self 指向类本身。
类里面想要操作静态成员,使用关键字 self
常量
类中使用关键字,const 定义常量成员,类中访问常量使用self
对象不能操作常量
总结
类中的成员
Public protected private static const;
对象克隆
1,对象和变量之间的赋值,不是克隆,而是将对象的内存地址赋值个变量,二者还是同一个对象。
2,Js通过Object.create()克隆对象
PHP中克隆,通过关键字clone 克隆一个对象。
通过关键字clone对象的时候,其实是调用类中的隐藏函数function __clone()
如果不让类生成的实例对象被被人克隆 在隐藏函数 function __clone 前面修改访问修饰符为protected就可以了
Interface接口
使用关键字 interface 定义接口,接口也是一个类
1,接口中的方法必须是公有的
2,接口中的方法是空的,不能定义,由去实现接口的类去定义。
3,使用implements关键字实现接口,并且要实现接口中的所有方法。
抽象类
通过关键字 abstract 定义的类都是抽象类
只要类中的方法被定义为抽象方法那么这个类一定是抽象类,抽象方法必须是空,不能定义他具体的功能实现,
注意
1,注意抽象类不能被实例化
2,子类去继承这些抽象类的时候,一定要去实现抽象类的抽象方法,且和抽象方法的访问权限必须一致。
3,子类使用关键字 extends去继承抽象类
抽象类方法中的参数
1,可选参数,带有默认值的参数为可选参数
2,子类继承抽象类,如果抽象类中的抽象方法有参数,子类方法必须也有这个参数可以不同名。
3,子类方法中可以有父类抽象方法中没有的可选参数。
Final
final关键字(放在父类中的方法前面,子类无法覆盖父类的这个方法)