一、不废话,一句话总结
原型
原型也属于对象的一个属性,每当定义一个函数数据类型时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值原型链
原型链是实例对象与原型之间的连接,每个对象都有一个proto属性,作为一个对象,当你访问其中的一个属性或方法的时候,如果这个对象中没有这个方法或属性,那么Javascript引擎将会访问这个对象的proto属性所指向上一个对象,并在那个对象中查找指定的方法或属性,如果不能找到,那就会继续通过那个对象的proto属性指向的对象进行向上查找,直到这个链表结束(Object.prototype.__proto__ === null )。
二、接下来深入理解
首先先理解几个概念
- 对象
JavaScript 中,万物皆对象!
分为普通对象和函数对象(凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象 Function Object 也都是通过 New Function创建的,所以Object ,Function 是JS自带的函数对象) - 函数
JavaScript 函数是被设计为执行特定任务的代码块。
JavaScript 函数会在某代码调用它时被执行。 - this
在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象。
在函数中,this 表示全局对象。
在函数中,在严格模式下,this 是未定义的(undefined)。
在事件中,this 表示接收事件的元素。
类似 call() 和 apply() 方法可以将 this 引用到任何对象 - 构造函数
不同于其它的主流编程语言,JavaScript的构造函数并不是作为类的一个特定方法存在的; 当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。
一个函数要作为一个真正意义上的构造函数,需要满足下列条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。 - 原型继承
所有 JavaScript 对象都从原型继承属性和方法。
日期对象继承自 Date.prototype。数组对象继承自 Array.prototype。
Object.prototype 位于原型继承链的顶端。
日期对象、数组对象都继承自 Object.prototype。 - 原型链
每个实例对象( object )都有一个私有属性(称之为 __proto__ )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( __proto__ ) ,层层向上直到一个对象的原型对象为
null。根据定义,null没有原型,并作为这个原型链中的最后一个环节。几乎所有 JavaScript 中的对象都是位于原型链顶端的
Object的实例Function.prototype.a = "a"; Object.prototype.b = "b"; function Person(){} console.log(Person); //function Person() let p = new Person(); console.log(p); //Person {} 对象 console.log(p.a); //undefined console.log(p.b); //b p没有b属性,会一直通过__proto__向上查找, 最后当查找到Object.prototype时找到,最后打印出b, 向上查找过程中,得到的是Object.prototype,而不是Function.prototype, 找不到a属性,所以结果为undefined,这就是原型链, 通过__proto__向上进行查找,最终到null结束
有时间再继续更新...