首先,我们先来回顾以下对象的几种创建方式:
1.对象字面量
2.原型创建
3.构造函数创建对象(工厂模式)
注意:对象创建方式的本质都是利用构造函数创建对象
原型对象:
1.原型对象:
当声明一个函数的时候,编译器会帮你自动创建一个与函数对应的对象,所有函数都有原型对象但是只有构造函数的原型对象才有用武之地,这个对象专属与该函数,不是全局,被放在该函数的prototype属性中,所以函数的
prototype属性即为原型对象,构造函数的方法资源浪费问题 + 解决全局变量污染问题
与原型有关的几个属性:
1.prototype : 属于构造函数,指向原型对象
2.__proto__:属于实例化对象,指向原型对象
3.constructor属性:属于原型对象,指向构造函数
// 1.构造函数
function Person(name,age){
this.age = age;
this.name = name
}
// 原型对象
Person.prototype.eat = function(){
console.log("蒙面大婶")
}
// 2.实例化对象
var p1 = new Person("dashen",18)
console.log(p1)
p1.__proto__.eat()
p1.eat()
// console.log(p1.__proto__ == Person.prototype)
总结:
1.原型对象:函数声明的时候,系统会自动创建与函数对应的对象
作用:解决资源浪费 + 全局变量污染
使用:构造函数.prototype
实例化对象可以直接使用原型对象上的成员
2.构造函数、原型对象、实例对象三者的关系:
1.prototype属性:属于构造函数,指向原型对象
作用:解决资源浪费 + 全局变量污染
2.__proto__属性:属于实例化对象,指向原型对象
作用:可以让实例化对象调用原型对象的成员
3.constructor属性:属于原型对象,指向构造函数
作用:可以让实例化对象知道自己是被谁创建的