文章目录
0.前言
构造函数和原型对象这块一直觉得没吃透,终于有时间好好从头梳理一番,算是温故知新.
1.对象具有唯一性
function Person() {
this.say = function() {
console.log("helloOBJ");
}
}
var p1 = new Person;
var p2 = new Person;
console.log(p1 == p2); //false
console.log(p1.say == p2.say); //false
那么对象的方法也不相等,而方法在功能上是完全一样的,没必要各自占据不同的内存空间
2.原型对象可以解决构造函数多次创建而产生的大量同名函数的问题
prototype属性:访问构造函数的原型对象
console.log(Person.prototype);//Object
/*原型对象长这样:
Object
say: ƒ ()
constructor: ƒ Person()
[[Prototype]]: Object
Person.prototype可以看看原型对象上被写了哪些属性和方法
*/
原型对象本质上也是对象,可以添加方法,可让所有构造函数的实例化对象使用,达到节约内存的目的
3.给原型对象添加方法,并让不同的实例对象去调用
function Person() {
}
console.log(Person.prototype);
Person.prototype.say = function() {//给原型对象添加say方法
console.log("helloOBJ");
}
var p1 = new Person;
var p2 = new Person;
p1.say();//helloOBJ
p2.say();//helloOBJ
发现都能调用say方法
*原型对象可以通俗理解为构造函数Person的"父类",给其添加了方法,那么"子类"Person的所有实例化对象就继承了这个方法
4.构造函数,原型对象,实例化对象之间的关系和一些概念的理解(重点)
概念 | 解释 |
---|---|
构造函数 | 上例中的Person(特征:首字母大写) |
prototype | 构造函数的一个属性,通过它可以访问原型对象的方法或属性 |
原型对象 | 如无形的"父类",它被添加了什么方法或属性,那么其"子类"(Peoson)的所有实例化对象都可以调用 |
实例化对象 | 上例中的p1和p2,是通过构造函数new出来的 |
Person.prototype.say() | 向Person的原型对象添加say方法 |
p1.say() | Person的实例化对象p1调用原型对象上的say方法 |