1.成员
- 构造函数中的属性和方法我们称为成员,成员可以添加
- 实例成员:构造函数内部通过this添加的成员。只能通过实例化的对象访问。
- 静态成员:在构造函数本身上添加的成员。只能通过构造函数访问
2.原型及原型链
2.1构造函数原型
- prototype ,函数名.prototype.方法
- 每一个构造函数都有一个原型对象
- 一般情况下,我们的公共属性定义到构造函数里面,公共方法放到原型对象身上
- 优点:节省内存,共享方法
- 值是一个地址,指向一个空间
2.2对象原型
- _ _ proto_ _ ,任何对象都有对象原型
- 对象身上系统自己添加一个__proto__指向我们构造函数的原型对象prototype
- 方法的查找规则:首先先看对象身上是否有方法,如果有就执行对象身上的方法;如果没有方法,因为__proto__的存在,就去构造函数的原型对象prototype身上去查找方法
2.3constructor
- 构造函数原型和对象原型都有这个属性
- 指回构造函数本身,记录对象引用了哪个构造函数
- 原型链成员查找规则:
- 先找自身是否有这个方法
- 再找原型对象身上是否有方法
- 接着找Object原型对象身上是否有这个方法
- 如果都没有,就是空null,返回undefined
- 找到了就输出,就近原则
3.调用函数的几种模式
- 函数模式,this=>window
function fn(){};
fn(); - 方法模式,this=>函数的调用者
var obj = {say:function(){}};
obj.say(); - 构造函数模式,this=>实例
function p(){};
var person = new p; - 上下文调用模式,this=>实例
var o = {};
function fun(){};
fun.call(o);
4.call语法
- 语法:方法名.call()
- 目的:方法的借用
- 关于参数
- 当不传参时,相当于是函数模式,调用函数
- 当传参时,第一个参数写对象时,相当于是方法模式
- 原函数有参数时,写为:方法.call(null,实参)
4.1 继承属性
function Father(uname,age){
this.uname = uname;
this.age = age;
}
function Son(uname,age,sing){
Father.call(this,uname,age);
this.sing = sing
}
var son = new Son('zjl',35,'lalala');
console.log(son);
4.2继承方法
function Father(uname,age){
this.uname = uname;
this.age = age;
}
Father.prototype.money = function(){
console.log(10000);
}
function Son(uname,age,score){
Father.call(this,uname,age);
this.score = score;
}
Son.prototype = new Father();
Son.prototype.constructor = Son;
Son.prototype.exam = function(){
console.log('100');
}
var son = new Son('dd',35,100);
console.log(son);
console.log(Father.prototype);
console.log(son.__proto__.constructor);
5.es5中数组的方法
- forEach,遍历,没有返回值
- filter,过滤,返回符合要求的新数组
- map,映射,返回新数组
- some,是否有满足条件的元素,返回布尔值
- every,是否全部满足条件,返回布尔值
6.es5中对象的方法
- Object.keys(),获取对象自身所有的属性,输出一个数组
- Object.defineProperty(目标对象,属性名,属性特征),定义新属性或修改原有的属性
6.1属性特性
- value,属性值,有则修改,无则添加
- writable,设置值是否可以修改,true或false,默认false不可以
- enumerable,设置属性是否可以被遍历,true或false,默认false不可以
- configurable,是否可以删除,是否可以再次被修改,true或false,默认false不可以