原型链之Object,Function,__proto__,prototype

一、基础知识点

  1. javascript中,“函数”(方法)也是对象。
  2. 一切对象都有一个根源。它是Object.prototype。
  3. 根源之上再没有其他根源,Object.prototype.proto === null

注:省去proto的下划线

二、构造函数

通过new关键字可以用来创建特定类型的对象的函数;只要创建了一个新函数,每个函数在创建之后都会获得一个prototype的属性,这个属性指向函数的原型对象(原型对象在定义函数时同时被创建),此原型对象又有一个名为“constructor”的属性,反过来指向函数本身,达到一种循环指向。

function Person(){}
alert(Person.prototype.constructor===Person);//true

三、prototype

每个函数都有一个prototype属性,它是一个指向原型对象的指针,原型对象在定义函数时同时被创建,原型对象的用途是包含所有实例共享的属性和方法

function Person(){

}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.sayName=function(){
 console.log(this.name);
};
//原型对象中的所有属性和方法 都会自动被所有实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom

四、proto

当调用构造函数创建一个新实例后,该实例的内部将包含一个指针proto,该指针指向创建它的构造函数的原型(prototype),大多数浏览器都支持proto

function Person(){
}
//自定义原型对象的属性和方法
Person.prototype.name="Tom";
Person.prototype.sayName=function(){
 console.log(this.name);
};
//原型对象中的所有属性和方法 都会自动被所有实例所共享
var person1=new Person();
var person2=new Person();
person1.sayName();//Tom
person2.sayName();//Tom
console.log(person1.__proto__===Person.prototype);//true

用一张图表示实例“构造函数”,“对象proto”和“函数prototype”的关系:
构造函数,__proto__和prototype
注:[[prototype]]就是proto

五、特例

Object和Function既是对象,又是函数,两者内部同时含有proto和prototype属性,他们关系较为复杂,以下做归纳。

Function.prototype指向”内置函数“。而Object.prototype指向”根源对象“

Object.__proto__ === Function.prototype //true
Object.__proto__ === Function.__proto__//true
Object.prototype === Function.prototype.__proto__ // true
//因此
Function instanceof Object //true
Object instanceof Function //true

x instanceof y,当y的原型对象在x的原型链之上,返回true,否则返回false;

关系图如下:

Function和Object

猜你喜欢

转载自blog.csdn.net/qq_36470086/article/details/82599604