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)原型链是由隐式原型属性组成的引用链

 

posted @ 2021-12-30 21:35  嗜血汽车人  阅读(61)  评论(0)    收藏  举报