1、*Object继承
Object继承:父对象的成员(属性和方法),子对象可以直接使用
为什么:【代码重用】!节约内存控件,提升网站的性能!
何时继承:只要多个子对象共用的属性和【方法】,都要集中定义再父对象之中,尤其是方法,方法/函数也是一个对象,创建的函数越多性能越差
2、*如何去找到父对象(原型对象)
如何去找到父对象(原型对象)两种:保存一类子对象共有属性和共有方法的
1、对象名.__proto__;
2、构造函数名.prototype;
几乎人人都有,除了undefined,null,Math
3、面试题:两链一包:作用域链、闭包、原型链
每个对象都有一个属性:__proto__,可以一层一层的找到每个人的父亲,形成的一条链式结构,我们就称之为叫做原型链
可以找到所有父对象的成员(属性和方法),作用:查找共有属性和共有方法
最顶层是Object的原型,上面放着我们眼熟的toString,怪不得人人都可以toString();
JS万物皆对象
4、有了原型对象,设置共有属性和共有方法
1、原型对象.属性名=属性值;
2、原型对象.方法名=function(){}

笔试题
1、判断自有还是共有
1、判断自有:obj.hasOwnProperty("属性名");
如果结果为true,说明是自有属性,如果结果为false,有两种可能:共有或没有
2、判断共有:
if(obj.hasOwnProperty("属性名")==false&&"属性名" in obj){
console.log("共有")
}else{
console.log("没有")
}
公式:
if(obj.hasOwnProperty("属性名")){
console.log("自有")
}else{
if("属性名" in obj){
console.log("共有")
}else{
console.log("没有")
}
}

2、修改/删除 自有和共有
自有:修改:obj.属性名=新属性值
删除:delete obj.属性名
共有:修改:原型对象.属性名=新属性值
删除:delete 原型对象.属性名

3、如何为老IE的数组添加indexOf(indexOf的底层原理) - 不是固定的,但是是一种类型题,为一类人添加方法
if(Array.prototype.indexOf===undefined){
Array.prototype.indexOf=function(key,starti){
starti===undefined&&(starti=0);
for(var i=starti;i<this.length;i++){
if(this[i]==key){
return i;
}
}
return -1;
}
}

4、*如何判断x是不是一个数组:千万别用typeof,typeof只能判断原始类型,引用类型显示的都是一个object,这道题也不是固定的
4种:
1、判断x是否继承自Array.prototype
Array.prototype.isPrototypeOf(x);
2、判断x是不是由Array这个构造函数创建的
x instanceof Array
3、Array.isArray(x); - ES5提供,只要是ES5+,老IE都不支持!只有数组有
4、***输出【对象的字符串】形式,说白了就是转为字符串来判断
在Object的原型上保存着最原始的toString方式
原始的toString输出的形式:[object 构造函数名]
***多态:肤浅理解,一个方法有多种表现形态,子对象觉得父对象提供的成员不好用,在本地定义了同名成员,来覆盖父对象
固定套路:借用:Object.prototype.toString.apply(x) === "[object Array]";
true->数组 false->不是数组

5、实现自定义继承:
1、实现两个对象之间继承:
子对象.__proto__=父对象
2、实现批量对象继承
构造函数名.prototype=父对象
但是要小心时机,必须在创建对象之前,确定关系
