前端小白浅析原型与原型链

构造函数

function Person(name,age){
	this.name = name;
	this.age = age;
	this.sayName = function(){};
}
var person1 = new Person("Amy",20);
var person2 = new Person("Tom",22);

函数Person是一个构造函数,person1和person2都是该构造函数的实例。实例都有一个constructor构造函数属性,指向其构造函数,即 person1.constructor == Person

原型对象

每个函数对象都有一个prototype属性,该属性指向函数的原型对象。所有原型对象都会自动获得一个constructor属性,该属性指向prototype属性所在的函数。即Person.prototype.constructor = Person。根据上面实例person1具有constructor,可得出Person.prototype也是Person的实例,即原型对象也是构造函数的一个实例。

__ proto __

JS创建对象的时候,都有一个__proto__内置属性,指向它的构造函数的原型对象,即person1.__ proto___ == Person.prototype
结合上面可得:

Person.prototype.constructor == Person;
person1.__proto__ == Person;
person1.constructor == Person;

由此可得知,构造函数与实例对象之间并无联系,其中的连接是存在于实例与构造函数的原型对象之间。

function A(name){
	this.name = name
}
var a = new A();

上面创建了一个函数名为A的构造函数,由此创建了一个a实例对象,a.__proto__属性指向构造函数A的原型对象A.prototype,而对象都有__proto__属性,A.prototype也是对象,故指向其构造函数所在的原型对象即Object.prototype,最后,Object.prototype的__proto__属性指向null。如下图:
前端小白浅析原型与原型链_第1张图片
需要注意的是,函数对象也是对象,也具有__proto__属性,所有函数对象的__proto__属性都指向Function.prototype。

原型链

以上,根据我的理解,原型链就是由原型组成的链条,每个对象都有__proto__属性,指向其构造函数的原型对象,当我们需要获取对象的某个属性时,在对象上没有找到,就会通过__proto__属性一级一级往上找,直到得到null,这个过程就形成了原型链。

你可能感兴趣的:(前端小白浅析原型与原型链)