原型对象和原型链的理解
前言
对于前端初学者的我来说,JavaScript的原型是一个头疼的问题,在学习过程中容易混淆prototype和__proto__之间的关系,他们的各种指向也让人缭乱。
prototype和__proto__之间关系还处于迷糊之中,又出现了一个原型链,这就让我更加缭乱了。在查阅资料后,有了一些浅显地理解,错误之处望各位指教!
一、prototype原型对象
1.概念:在JavaScript中,我们声明一个函数, 那么浏览器就会在内存中创建一个对象,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象就是函数的原型对象,简称函数的原型。
2.作用:开发中常有一些公共方法,而这些方法我们可以通过添加到构造函数的原型对象prototype上,这样构造函数构造的对象都可共享这些方法。
function Fn1(name) {
this.name = name;
}
// 可已将方法保存到原型对象上,实例化对象也可以访问,但是不用保存,节省内存
Fn1.prototype.say = function () {
console.log(this.name + '喜欢丝袜奶茶!');
}
let f3 = new Fn1('zs');
let f4 = new Fn1('ls');
console.log(f3, f4);
f3.say();
f4.say();
二、对象原型__proto__
1.只要是对象即存在__proto__,指向构造函数的原型对象。
2.之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有_ proto 原型的存在。
function Fn1(name) {
this.name = name;
}
// 可已将方法保存到原型对象上,实例化对象也可以访问,但是不用保存,节省内存
Fn1.prototype.say = function () {
console.log(this.name + '喜欢丝袜奶茶!');
}
let f3 = new Fn1('zs');
let f4 = new Fn1('ls');
console.log(f3, f4);
f3.say();
f4.say();
三、构造函数、prototype原型对象与对象原型__proto__的关系
1.方法查找原则的应用
(1)首先看对象身上是否有某种方法,如果有就执行这个对象上的方法。
(2)如果对象上没有,因为对象中含有__proto__存在,就会去原型对象prototype身上查找。
2.__proto__对象原型和原型对象prototype是等价的。__proto__对象原型的意义就在于为对象的直找机制提供一个方向,或者说一条路线,但是它是一个非标准属性,因此实际开发中,不可以使用这个属性,它只是内部指向原型对象prototype。
3.如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则需利用constructor指回原来的构造函数。
三、原型链
1.只要是对象即存在__proto__,并指向prototype.
2.原型对象(prototype)里面的__proto__原型指向的是Object.prototype
3.Object.prototype中原型对象(prototype)里面的__proto__原型指向的是null.