面向对象三大特点:
封装:将一个事物的属性和功能集中定义在一个对象中 (代码重用)
继承:父对象的成员,子对象不必重复定义,可直接使用,js中一切继承都是继承原型――原型继承(节约内存)。
多态:同一事物,在不同情况下表现出不同状态;
一个引用类型(变量)在不同情况下的多种状态
使用:做面向对象开发时,一个方法不变,但是它接收的参数类型是变化的。
1、封装
1. 直接量: var obj={ name:'obj',value:'0000' }; *****js中一切都是对象;一切对象都是关联数组:
a) 每个属性都有两种访问方式: obj.name 或 obj["name"]
2. 实例化Object类型对象: var obj=new Object();
a) new可省略,()也可省略,不能同时省略
2、封装与继承
构造函数:专门描述一类对象的统一结构的函数
a) 定义构造函数:
b) 实例化类型的对象: var obj=new 构造函数名/类型名(属性值列表);
//创建构造函数--反复创建多个相同结构的对象
function Student(name,age){
this.name=name;
this.age=age;
}
//实例化对象--创建的对象
var s1 = new Student("glow",19); //Student {name: "glow", age: 19}
console.log(s1);
var father={bal:1000,car:"infiniti"};
Student.prototype = father;
Student.prototype.intrSelf = function(){
console.log('空对象继承构造函数的原型');
}
//s1自动继承intrSelf
s1.intrSelf() //空对象继承构造函数的原型
Object.setPrototypeOf(s1,father); //设置s1对象的原型属性为father
//s1.intrSelf() => s1.intrSelf is not a function
console.log(s1.car);//infiniti
c) new的执行过程:
1. var obj = {} ; 创建一个空对象
2. obj.__proto__ = Student.prototype; 将空对象的__proto__属性赋值为构造函数(Student)的原型(prototype)
3. Student.call(obj) ;调用构造函数向空对象中添加属性和方法
4. return obj; 返回新对象的地址给变量
原型:保存同一类型的所有子对象共有成员的对象
原型的操作:
写操作:Object.setPrototypeOf()、
读操作:Object.getPrototypeOf(Student) //通过子对象,向上获得
let i = Student.prototype; //通过构造函数获得对象的父级原型对象
console.log(i)
生成操作:Object.create()
原型链: 由各级对象的__proto__属性,逐级继承形成的链式结构,规定局部变量的使用顺序,
所有原型链的顶部都是Object.prototype,没有则返回undefined
作用域链: 从当前函数的AO到全局对象window形成的链式结构,规定对象的属性的使用顺序
自有属性和共有属性判断:
自有属性:let own = s1.hasOwnProperty("ages") // false
共有属性:!s1.hasOwnProperty("age")&&("age" in s1)==true // false
in: 在对象的整个原型链上查找“属性名”是否存在
判断两对象间的父子/继承关系:
let bool = Object.prototype.isPrototypeOf(s1); //父对象.isPrototypeOf(子对象)
javascript 面向对象编程基础 多态:http://www.jb51.net/article/19720.htm
js面向对象三大特征之多态笔记:http://www.cnblogs.com/hezhi/p/4578763.html