js高级-原型链


(1)所有的实例对象都有隐式原型属性/在被创造时就添加到该对象上
所有的函数都有显示.prototype 因为他们都是函数(对象)
(2)(所有)函数都是实例对象,他们都有_proto_,并且指向Function.prototype // 甚至包括广义的函数
function Foo(){} 函数本质上可以看成是function类型的构造函数new出来的新对象 let Foo = new Function()
(3)因为任意函数都是由Function new出来的,所以都是他的实例对象
都满足实例对象._proto_ === Function.prototype
String.__proto__===Function.prototype//true Number.__proto__===Function.prototype//true Boolean.__proto__===Function.prototype//true Object.__proto__ === Function.prototype//true 任意函数的__proto__都===Function.prototype
(4)Function 是一切函数的构造函数
所有函数都可以用Function构造函数方式定义
var add = new Function( 'x', 'y', 'return x + y' // 最后一个传入的参数是定义的函数体 ); // 等同于 function add(x, y) { return x + y; }
重要!(5)关于Function 本身的原型
因为function本身是一个函数对象实例,所以它有_proto_,和其他函数实例一样,指向Function.prototype
又因为function是所有函数实例的构造函数,它有自己的prototype
所以function._proto === function.prototype === function.prototype

(6)(构造)函数的显示原型默认指向一个空的object实例对象(object本身指向null)
(7)function.prototype 默认是空的object实例对象

(8)当读取对象属性值,会在需求时自动查找原型链
当设置对象属性值时,不会查找原型链,而是直接检测当前对象,没有就直接添加该属性
区别
- 执行函数定义: 代码执行到函数声明语句,或者匿名函数赋值变量语句时 == > 创建该函数实例对象保存到堆中,并没有执行函数体内容!!
var a = function() {} // 实际上是: var tmp = New Function('变量','函数体'); //new创建函数对象,并用临时变量tmp引用 var a = tmp //用a引用该函数 //最后自动销毁临时变量
- 执行函数(): 执行函数体{}内代码
(9)函数对象的prototype属性是什么时候如何创建的?
在执行函数定义时
会在函数对象内部执行该语句,为其添加prototype属性
this.prototype = {} = new Object() //创建了一个object空对象
(10)原型链是由隐式原型属性组成的引用链

浙公网安备 33010602011771号