首先我们要知道三个对象:
- 函数对象
- 实例对象
- 原型对象
1.函数对象:函数对象即为一个重载了括号 " ( ) " 的对象,使得可以像函数一样调用(总的来说就是自己定义封装的函数,再进行调用)
2.实例对象:new出的对象或者{ }
3.原型对象:所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的
原型和原型链都是围绕着这张图展开说明
Star 构造函数 :构造函数用于创建对象,初始化对象的值,构造函数中定义的方法,本质是属性,需要占用存储空间
function Star(uname, age) {
Star.sex = "男";//静态成员:通过函数名Star.sex 可以直接访问的成员,不属于任何的对象,实例共享
this.uname = uname;
this.age = age;
this.sing = function() {
console.log('唱歌')
}
}
ldh 实例对象:通过上面的Star 函数 new一个实例对象
var ldh=new Star('刘德华',88);
console.log(ldh);//打印 Star {uname: '刘德华', age: 88, sing: ƒ}
console.log(ldh.uname);//打印---刘德华
ldh.sing //打印---唱歌
原型constructor 构造函数
- 每个构造函数 都有一个prototype属性找到 原型对象
- 原型对象 可以使用constructor 来找到构造函数(这里Star是构造函数)
- 实例对象的proto属性可以找到原型对象
- Object原型对象的proto的是null
function Star(uname, age) {
this.uname = uname;
this.age = age;
}
Star.prototype.sing = function() {
console.log('唱歌');
}
Star.prototype.movie = function() {
console.log('演电影');
}
var ldh = new Star('刘德华', 18)
都打印Star,都指向的是star原型对象的prototype
console.log('Star.prototype.constructor---',Star.prototype.constructor);
console.log('ldh.__proto__.constructor---',ldh.__proto__.constructor);
打印---true
console.log(Star.prototype.constructor===ldh.__proto__.constructor);
JavaScript 成员查找机制(规则)
查找原型的机制也是和图一样,按着箭头一层一层往上面找,直到最后为null
- 当访问一个对象的属性或方法时,首先查找这个对象自身有没有
- 如果没有就查找它的原型(也就是 proto 指向的prototype 原型对象 )
- 如果还没有找到就查找原型对象的原型(Object的原型对象)
- 依次类推一直找到Object为止( null )
- proto 对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条线路
原型中的this指向
一句话盖括,谁调用函数 函数this就指向谁
使用原型对象扩展方法
创建一个方法,使数组里所有的数字相加
// 求数组的和
Array.prototype.sum = function() {
let num = 0;
for(var i = 0;i<this.length;i++) {
num += this[i];
}
return num;
}
let arr = [1,2,3,4];
let result = arr.sum();
console.log(result);