这几天闲了看了下js的原型,如下内容为我的理解,若有错误,尽请指正。函数
首先,明确一点:js中的对象分为普通对象和函数对象,通常咱们自定义的能够被new的函数称做函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、Boolean、RegExp、Error等这些函数对象:this
一、只有函数对象才有prototype属性,该属性指向的俗称“原型”或者“原型对象”,举个栗子:prototype
function Person() {} console.log(Person.prototype) // {constructor: Person, __proto__: Object}
二、每一个原型或者原型对象还有一个constructor属性,即上面的Person.prototype.constructor,该属性指向该函数的构造,这里指向Person自身,即:code
Person.prototype.constructor === Person // true
三、全部对象,不论普通对象仍是函数对象都有一个__proto__属性,该属性指向其构造的原型,使用__proto__将全部对象联系起来,才造成了所谓的原型链,举个栗子:对象
function Person() {} const p1 = new Person() console.log(p1.__proto__ === Person.prototype) // true, p1是由Person构造的 console.log(Person.prototype.__proto__ === Object.prototype) // true, Person的原型是由Object构造的,由于Person.prototype是一个普通对象,普通对象的构造都是Object console.log(Person.__proto__ === Function.prototype) // true, Person是由Function构造的 console.log(Function.__proto__ === Function.prototype) // true, Function是由自身构造的 console.log(Function.prototype.__proto__ === Object.prototype) // true, Function的原型是由Object构造的 console.log(Object.__proto__ === Function.prototype) // true, Object是由Function构造的,相似Person.__proto__ console.log(Date.__proto__ === Function.prototype) // true, Date是由Function构造的,相似Person.__proto__ console.log(String.__proto__ === Function.prototype) // true, String是由Function构造的,相似Person.__proto__ console.log(Boolean.__proto__ === Function.prototype) // true,Boolean是由Function构造的,相似Person.__proto__ console.log(Object.prototype.__proto__ === null) // true, Object的原型是由null"产生"的,null处于原型链顶端
这个从根本上印证了道德经那句:道(null)生一,一辈子二,二生三,三生万物。无,名天地之始。blog
四、通常咱们经过.操做符获取一个对象的属性或方法的时候,会首先在当前对象自身上查找该属性或方法,找不到的话会继续顺着__proto__也就是原型链向上查找,直到找到,不然返回undefined,举个栗子:继承
function Person() { this.name = 'Nicholas' this.age = 29 this.job = 'Software Engineer' this.sayName = function() { console.log(this.name) } } const person1 = new Person() const person2 = new Person() person1.sayName() person2.sayName()
[[Prototype]]即上面所说的__proto__,由上图能够直接得出以下结论:图片
Person.prototype.constructor == Person; person1.__proto__ == Person.prototype; person1.constructor == Person;
当咱们获取person1.age时,发现person1自身并没有age属性,因此会自动向上查找person1.__proto__.age,发现有并为29,则直接返回29,即person1.age === 29原型链
function Person() { this.name = 'Nicholas' this.age = 29 this.job = 'Software Engineer' this.sayName = function() { console.log(this.name) } } const person1 = new Person() console.log(person1.age === 29) // true
同理,查找person1.constructor时会自动查找到Person自身,因此以下是恒等的:原型
function Person(name) { this.name = name } var p = new Person('jack') console.log(p.__proto__ === p.constructor.prototype) // true
下一节的话讲下js中的继承~