马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一.继承:
面向对象3大特点:封装 继承 多态
封装:将相关的属性和方法,集中定义在一个对象中。
多态:js仅变相支持重载。
继承:父对象中定义的方法,子对象不用定义,可直接访问!
继承:
1. 一个对象,直接继承另一对象:
Object.setPrototypeOf(子对象,父对象)
相当于:子对象.__proto__=父对象
何时使用:只修改一个对象的父对象是使用。
- //一个对象直接继承另一个对象
- var father={car:"BMW",balance:10000000};
- var hmm=[];
- var lilei=[];
- Object.setPrototypeOf(hmm,father);
- console.log(hmm.car);
- console.log(hmm.balance); console.log(lilei.car);
复制代码
2.修改构造函数的原型对象,统一修改之后创建的所有子对象的公共原型:
构造函数.prototype=父对象
必须在首次实例化对象之前修改!
何时使用:批量修改未来所有子对象的父对象时,一旦子对象创建后,修改构造函数的原型,子对象无法继承新父对象
- //修改构造函数原型对象
- function Student(sname,age){
- this.sname=sname;
- this.age=age;
- }
- Student.prototype.intrSelf=function(){
- console.log("I'm "+this.sname+","+" I'm "+this.age);
- };
- var father={car:"BMW"};
- Student.prototype=father;
- var lilei=new Student("lilei",18);
- var hmm=new Student("hmm",19);
- console.log(lilei.sname);
- console.log(lilei.age);
- console.log(lilei.car);
- console.log(hmm.sname);
- console.log(hmm.age);console.log(hmm.car);
复制代码
如何判断一个对象是数组的几种方法:
typeof无法区分数组和一般对象,不能用来识别数组!
- //用typeof判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- console.log(typeof arr); //判断失败
- console.log(typeof obj); console.log(typeof fun);
复制代码
1. Array.prototype.isPrototypeOf(obj)
如果返回true,说明是数组,否则不是
- //判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- if(Array.prototype.isPrototypeOf(arr)){
- console.log("arr是数组");
- }
- if(Array.prototype.isPrototypeOf(obj)){
- console.log("obj是数组");
- }
- if(Array.prototype.isPrototypeOf(fun)){
- console.log("fun是数组"); }
复制代码
2. instanceof: 判断一个对象是否由某个类型创建出来
对象 instanceof 类型名
obj instanceof Array 返回true,说明是数组
instancof会查找原型链上所有原型的构造函数
- //判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- console.log(arr instanceof Array);
- console.log(obj instanceof Array); console.log(fun instanceof Array);
复制代码
3. getPrototypeOf:
Object.getPrototypeOf(obj)==Array.prototype
- //判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- console.log(Object.getPrototypeOf(arr)==Array.prototype);
- console.log(Object.getPrototypeOf(obj)==Array.prototype); console.log(Object.getPrototypeOf(fun)==Array.prototype);
复制代码
4. Object.prototype.toString()方法:
重写:override,子对象觉得父对象的方法不好用,可自己定义同名的自有方法替换父对象的方法
call和apply: 在调用方法的一瞬间,替换调用方法的对象,
Object.prototype.toString.call(arr)
.apply(arr)
- //判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- console.log(Object.prototype.toString.call(arr));
- console.log(Object.prototype.toString.call(obj)); console.log(Object.prototype.toString.call(fun));
复制代码
5. Array.isArray(obj): 专门判断对象是否是数组!但存在浏览器兼容性问题
- //判断一个对象是否是数组
- var arr=[1,2,3]; //Array.prototype
- var obj={}; //Object.prototype
- var fun=function(){}; //Function.prototype
- console.log(Array.isArray(arr));
- console.log(Array.isArray(obj)); console.log(Array.isArray(fun));
复制代码
|