一、对象继承
继承:夫对象的属性和方法,子对象可以直接使用;可以代码重用,节约内存空间,提升性能。
对象中,父对象称为原型:原型保存着这一类的对象共有的属性和共有方法;找原型方法:
对象名.__proto__;//通过对象名来找它的原型,但是这样只是找到它上一层的原型,并不是最终的原型;
构造函数名.prototype;//对象的构造函数名,除了Math,其他都有构造函数方法:例如:
Array.prototype;找到的就是数组的原型。
上面两种方法找到的都不是最顶层的原型,最顶层的原型是Object.prototype;其他对象想要找到最顶层的原型需要通过.__proto__一层一层来往上找,这就是原型链;JS中万物的顶层原型都是对象,除了null和undefined;
如何判断对象的属性是自有,还是共有:
var obj={
"name":"dada",
"dizhi":"ada"
}
obj.__proto__.fff=function(){
console.log(1)
}
obj.__proto__.qqq="sfasf";
//放入方法名或者属性名
if(obj.hasOwnProperty("qqq")){
console.log("自有")
}else{
if(obj.hasOwnProperty("qqq")==false&&"qqq" in obj){
console.log("共有")
}else{
console.log("没有")
}
}
删除修改自有和共有:
删除自有属性:delete obj.属性名;
修改自有属性:obj.属性名=新值;
修改共有属性不能在本地直接修改:obj.__proto__.属性名=新值;
删除共有:delete obj.__proto__.属性名;
为一类对象添加共有方法:
构造函数名.prototype.方法名=function(){方法的操作}
如何判断对象是什么类型:
var arr=[1,2,3,4,10]
var de=new Date;
var arr2=[]
var obj={}
var str="1,2,3,4,10"
console.log(Array.prototype.isPrototypeOf(arr))//true
console.log(Date.prototype.isPrototypeOf(de))
console.log(String.prototype.isPrototypeOf(str))//false
console.log(Object.prototype.isPrototypeOf(obj))
console.log("------------------------------------------------")
console.log(arr instanceof Array)//true
console.log(de instanceof Date)//true
console.log(obj instanceof Object)//true
console.log(str instanceof String)//false
console.log("------------------------------------------------")
console.log(Array.isArray(arr))//true,数组能用
// console.log(Date.isDate(de))
// console.log(String.isString(str))
// console.log(Object.isObject(obj))
console.log("------------------------------------------------")
console.log(Object.prototype.toString.apply(arr))//输出的是object Array
console.log(Object.prototype.toString.apply(de))//输出的是object Date
console.log(Object.prototype.toString.apply(str))//输出的是object String
console.log(Object.prototype.toString.apply(obj))//输出的是object Object
实现自定义继承:
1、两个对象之间设置继承:子对象.__proto__=想设置成子对象原型的对象名
2、多个对象设置继承:需要用自定义构造函数方法创建对象,构造函数名.prototype=想设置成子对象原型的对象名
二、多态
同一个函数名拥有多种形态或不同效果;子对象觉得父对象的成员不好用,可以本地定义同名成员,覆盖了父对象的成员,比如toString不同的人使用效果不同,其实根本不是同一个toString