**抽象的(构造函数-相当于一个模板)**
**具体的(实例对象)**
javascript
// 构造函数--模板
function GirlFriend(name,age,profile,favours){
this.favours = favours;
this.name = name;
this.age = age;
this.profile = profile;
this.eating = function(){
console.log(this.favours);
}
this.shopping = function(){
console.log('shopping');
}
this.coding = function(){
console.log('coding');
}
}
// 具体的实例对象
var gf1 = new GirlFriend('翠花',35,'沉鱼落雁,闭月羞花'['香蕉','苹果','梨']);
var gf2 = new GirlFriend('翠花',35,'ugly'['糕点','红豆冰','韭菜盒子']);
// 工厂(用来生产实例对象)(设计模式)
function factory(name,age){
//var obj = new Object();
//var obj = new Object;// 如果构造函数不需要传递参数,那么实例化时可以省略括号
var obj = {};
obj.name = name;
obj.age = age;
return obj;
}
var o1 = factory('tom',12);
var 02 = factory('jerry'13);
实例对象如何产生?
1. 通过构造函数实例化 new
2. 对象字面量(本质上内部也需要构造函数)
所有的实例对象都有一个对应的构造函数(包括DOM实例对象)
一般情况下真正的数据存储在实例对象中,而不是在构造函数中
对象实例化本质:
1. 浏览器根据构造函数在内存中开辟一块内存
2. 浏览器会给上面产生的内存起一个名字this(本质上就是内存地址)
3. 通过this给这块内存添加数据
4. 把this返回给一个变量
构造函数(模板-抽象的)
实例对象(具体的)
原型 (1、数据共享(实例对象共享数据);2、实现继承)
三者关系及联系:
1. 所有的构造函数中都有一个原型属性prototype,本质上该属性就是对象(Object的实例对象),该属性位于函数上
2. 原型对象中默认有一个属性constructor,该属性指向原型所属的构造函数
3. 所有的实例对象中都有一个--proto--属性,该属性也指向构造函数的原型对象,注意:--proto--属性不可以在编程中使用,该属性不是标准属性,实际上该属性是浏览器内部自己使用的,该属性位于实例对象
prototype与--proto--:这俩个属性从本质上没有差别,都指向内存的同一个位置
```javascript
/*
原型链是什么?
实例对象和原型对象之间形成的链式结构(链接节点的属性是--proto--)
对于原型链来说,属性的搜索规则:优先从链的起点查询,如果找到了,就返回,如果没有找到就去上层节点查询,直到查询到Object.prototype,如果这里还没有找到就证明,没有该属性