本文详情: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 就能够中止查找了。
最后一张关系图也能够更新为: