JavaScript系列 - 深刻之从原型到原型链

本文详情:https://github.com/mqyqingfen...git

构造函数建立对象
先使用构造函数建立一个对象github

function Person(){

}
var person = new Person();
person.name = "Mit";
console.log(person.name)

在这个例子中,Person 就是一个构造函数,咱们使用 new 建立了一个实例对象 person。函数

prototype
每一个函数都有一个prototype对象spa

function Person() {

}
// 虽然写在注释里,可是你要注意:
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

函数的prototype对象指向该构造函数建立实例的原型
图片描述prototype

(__proto__)
每一个js对象都具备一个属性,叫__proto__,这个属性指向该对象的原型3d

function Person() {

}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true

更新以下
图片描述code

constructor
每一个原型都有一个constructor属性指向关联的构造函数
图片描述对象

实例和原型
当读取完实例的属性是,若是找不到,就会查找与对象关联的原型中的属性,若是找不到,就回去原型中去查找blog

function Person() {

}

Person.prototype.name = 'Kevin';

var person = new Person();

person.name = 'Daisy';
console.log(person.name) // Daisy

delete person.name;
console.log(person.name) // Kevin

原型的原型
在前面,咱们已经讲了原型也是一个对象,既然是对象,咱们就能够用最原始的方式建立它,那就是:图片

var obj = new Object();
obj.name = 'Kevin'
console.log(obj.name) // Kevin

其实原型对象就是经过 Object 构造函数生成的,结合以前所讲,实例的 proto 指向构造函数的 prototype ,因此咱们再更新下关系图:

图片描述

原型链

那 Object.prototype 的原型呢?

null,咱们能够打印:

console.log(Object.prototype.__proto__ === null) // true

然而 null 究竟表明了什么呢?

引用阮一峰老师的 《undefined与null的区别》 就是:

null 表示“没有对象”,即该处不该该有值。
因此 Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

因此查找属性的时候查到 Object.prototype 就能够中止查找了。

最后一张关系图也能够更新为:
图片描述

相关文章
相关标签/搜索