类是对象的模板,对象是类的实例。在es6之前并没有引入类的概念,对象是通过构造函数来定义的。
创建对象的方式:
1.对象字面量
2.new Object()
3.自定义构造函数
构造函数与原型
构造函数 用来初始化对象,与new一起使用,可以把对象中的一些公共属性和方法封装到这个函数中。
注意:
- 构造函数创建某一类对象时,首字母要大写
- 构造函数与new 一起使用才有意义
// 构造函数
function Star(uname,age){
// 构造函数中成员分为俩种:实例成员和静态成员
// 实例成员:构造函数内通过this添加的成员
// 实例成员只能通过实例化对象访问
this.uname = uname;
this.age = age;
this.sing = function(){
console.log('唱起来');
}
}
// 原型对象上定义dance方法,这个方法共享到所有构造函数的实例中
Star.prototype.dance = function(){
console.log('跳');
}
var ldh = new Star('刘德华',18);
ldh.sing();
// 静态成员:在构造函数本身上添加的成员 sex就是静态成员
Star.sex = '男';
// 静态成员只能通过构造函数来访问,不能用实例访问
console.log(Star.sex);
// 实例 ldh直接访问构造函数中原型对象上的方法
ldh.dance(); // 对象身上系统自动添加一个__proto__指向我们构造函数的原型对象
// 一般,公共属性定义到构造函数中,公共方法我们放到原型对象上。
console.log(ldh.proto === Star.prototype);// 原型__proto_ 指向prototype ,true
// 方法的查找规则:首先看对象是否有dance这方法,有则执行对象上的dance,若无,因为有__proto__的存在,就去构造函数的原型对象prototype上查找。
new在执行时会做四件事
1.在内存中创建一个新的空对象
2.让this指向这个新对象
3.执行构造函数里面的代码,给新对象添加属性和方法
4.返回这个对象(所以构造函数不需要return)
构造函数的问题
每次新实例对象 都会开辟新的内存空间,存在内存浪费的问题。
构造原型对象(prototype)来 解决这个问题
js规定每一个构造函数都有一个prototype对象,这个对象的所有属性和方法都会被构造函数的对象所拥有。
我们可以将那些不变的对象和方法,直接定义在prototype对象上,这样所有的对象的实例都可以共享这些方法。
so,原型是一个对象,构造函数中的prototype属性我们称之为原型对象,原型对象用来共享数据。
对象原型
对象原型 __proto__
对象都有一个属性 __proto__,指向构造函数的prototype原型对象,我们对象可以使用构造函数的prototype的属性,就是因为对象有 __proto__原型的存在。
- __proto__对象原型与原型对象prototype是等价的
- __proto__对象原型的意思在于为对象的查找机制提供了方向,但他是非标准属性,实际开发中不可以使用这个属性,它只在内部指向原型对象prototype。
constructor 构造函数
对象原型(__proto__)和构造函数原型对象(prototype)里面都有一个属性constructor属性,称之为构造函数,因为它指回构造函数本身。
constructor主要用于记录该对象引用那个构造函数,它可以让原型对象重新指回原来的构造函数
Star.prototype.dance = function(){
console.log('跳');
}
// 如果在prototype中需要添加很对方法,采用下面这种写法简洁一些,
// 但是需要让原型对象重新指回原来的构造函数
Star.prototype = {
// 如果我们修改了原来的原型对象,给原型对象赋值一个对象,则必须手动利用constructor指回原来的构造函数
constructor:Star,
dance:function(){
console.log('跳');
},
song:function(){
}
}
js成员查找机制
1.当访问一个对象属性时,首先查找这个对象本身又没该属性
2.若无,查找它的原型(也就是__proto__指向的prototype原型对象)
3.还无,则查找原型对象的原型(Object.prototype)
4.以此类推一直找到Object为止(null)
5.__proto__的意义就是为对象成员查找提供一个方向
原型链图

原型对象this指向问题
1.在构造函数中,this指向对象实例
2.原型对象函数中的this指向对象实例
(函数中的this指向调用者)
扩展对象内置方法
Array.prototype.sum = function(){
var sum = 0;
for(var i=0;i<this.length;i++){
sum += i;
}
return sum;
}