**
## 继承
**
//ES6之前并没有给我们提供 extends 继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承。
2.1 call()
/* call方法:调用这个函数, 并且修改函数运行时的 this 指向
* fun.call(thisArg, arg1, arg2, …)
* thisArg :当前调用函数 this 的指向对象
* arg1,arg2:传递的其他参数
* */
function fn(x,y) {
console.log(‘我想喝手磨咖啡’);
console.log(this);//this指向函数的调用者
console.log(x+y);
};
var o = {
name : ‘andy’
}
//fn();
//1.call()可以调用函数
//fn.call();
//2.call()可以改变函数的指向
fn.call(o,1,2);
2.2 借用构造函数继承父类型属性
核心原理: 通过 call() 把父类型的 this 指向子类型的 this ,这样就可以实现子类型继承父类型的属性。
//1.父构造函数
function Father(name,age) {
//this指向的是父构造函数的对象实例
this.name = name;
this.age = age;
}
//2.子构造函数
function Son(name,age,score) {
//this指向的是子构造函数的对象实例
//使父构造函数中的this指向子构造函数中的this
Father.call(this,name,age);
//还可以添加自己的属性
this.score = score;
}
var son = new Son(‘刘德华’,22,99);
console.log(son)
//上述改变this指向问题可以使用断点解释其详细步骤:添加断点->刷新->点击下一步
Father实例对象与Father原型对象的内存空间不一样,所以Son的原型对象添加exam方法时,不会影响到Father原型对象
2.3 借用原型对象继承父类型方法
一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。
核心原理:
1. 将子类所共享的方法提取出来,让子类的 prototype 原型对象 = new 父类()
2. 本质:子类原型对象等于是实例化父类,因为父类实例化之后另外开辟空间,就不会影响原来父类原型对象
3. 将子类的 constructor 从新指向子类的构造函数
3. 类的本质
## 3. ES5 中的新增方法
3.2 数组方法
array.forEach(function(currentValue, index, arr))
查询商品案例
1. 把数据渲染到页面中 (forEach)
2. 根据价格显示数据
3. 根据商品名称显示数据
注:forEach与some区别
trim() 方法会从一个字符串的两端删除空白字符。
语法:str.trim()
trim() 方法并不影响原字符串本身,它返回的是一个新的字符串。
1. Object.keys() 用于获取对象自身所有的属性
语法:Object.defineProperty(obj, prop, descriptor)
- obj:必需。目标对象
- prop:必需。需定义或修改的属性的名字
- descriptor:必需。目标属性所拥有的特性
Object.defineProperty() 第三个参数 descriptor 说明: 以对象形式 { } 书写
- value: 设置属性的值 默认为undefined
- writable: 值是否可以重写。true | false 默认为false
- enumerable: 目标属性是否可以被枚举。true | false 默认为 false
- configurable: 目标属性是否可以被删除或是否可以再次修改特性 true | false 默认为false