js中__proto__和prototype的区别和关系 及constructor

function foo() {
  this.name = 'foo';
}
Function.prototype.sayHello = function (parent) {
  console.log(this.name);
};

console.log(foo.__proto__===Function.prototype);

foo.sayHello();

 

__proto__(隐式原型)与prototype(显式原型)

 

显式原型的作用:用来实现基于原型的继承与属性的共享。

隐式原型的作用:构成原型链,同样用于实现基于原型的继承。举个例子,当我们访问obj这个对象中的x属性时,如果在obj中找不到,那么就会沿着__proto__依次查找。

 

1.对象有属性__proto__,指向该对象的构造函数的原型对象。
2.方法除了有属性__proto__,还有属性prototype,prototype指向该方法的原型对象。

 

Object 是所有对象的爸爸,所有对象都可以通过 __proto__ 找到它

Function 是所有函数的爸爸,所有函数都可以通过 __proto__ 找到它

Function.prototype 和 Object.prototype 是两个特殊的对象,他们由引擎来创建

除了以上两个特殊对象,其他对象都是通过构造器 new 出来的

函数的 prototype 是一个对象,也就是原型

对象的 __proto__ 指向原型, __proto__ 将对象和原型连接起来组成了原型链

 

Function.__proto__ === Function.prototype; // true
Object.__proto__ === Function.prototype; // true Function.prototype.__proto__ === Object.prototype; // true Object.prototype.__proto__ === null; // true

 

每个函数在创建的时候,JS会同时创建一个该函数对应的prototype对象,而函数创建的对象.__proto__ === 该函数.prototype,该函数.prototype.constructor===该函数本身,故通过函数创建的对象即使自己没有constructor属性,它也能通过__proto__找到对应的constructor,所以任何对象最终都可以找到其构造函数

 

 

我们需要牢记两点:①__proto__和constructor属性是对象所独有的;② prototype属性是函数所独有的,因为函数也是一种对象,所以函数也拥有__proto__和constructor属性。
__proto__属性的作用就是当访问一个对象的属性时,如果该对象内部不存在这个属性,那么就会去它的__proto__属性所指向的那个对象(父对象)里找,一直找,直到__proto__属性的终点null,再往上找就相当于在null上取值,会报错。通过__proto__属性将对象连接起来的这条链路即我们所谓的原型链。
prototype属性的作用就是让该函数所实例化的对象们都可以找到公用的属性和方法,即f1.__proto__ === Foo.prototype。
constructor属性的含义就是指向该对象的构造函数,所有函数(此时看成对象了)最终的构造函数都指向Function。

posted @ 2021-10-12 18:06  果果1024  阅读(155)  评论(0)    收藏  举报