1)函数对象——就是平时称的对象;
2)实例对象——new出的对象或者{ };
3)原型对象——所有的函数对象都有一定有一个对应的原型对象,所有的原型对象都是被Object函数对象创建出来的
-
-
所有的原型对象中都有一个名为constructor引用类型变量,该引用类型变量是原型对象的成员,该引用类型变量的值是对应的函数对象的引用值,即constructor指向函数对象
-
实例对象是被对应的函数对象(new出来的那个函数)创建的。
-
所有对象中都有一个名为proto的引用类型变量,该引用类型变量是对象的成员
-
Function函数对象中proto指向Function原型对象
-
Object函数对象中proto值为null
1.1 原型= =>本质:对象
原型是函数的一个属性【prototype】==>通过它实例的对象可以继承得到原型上的所有属性方法
-
每个对象都有一个 proto
-
每个构造函数都有一个 prototype 属性,该属性指向实例对象的原型对象
-
原型对象里的 constructor 指向构造函数本身
1.2 隐式原型
-
所有的对象都有隐式原型:__ proto __属性
-
指向prototype
-
查找成员对象,如果没有该对象,会到隐式原型中查找
【原型和隐式原型出现原因:JS没有记录类型的元数据。只能通过各个对象的隐式原型来找到创建他的函数原型】
当试图访问一个对象的属性时,不仅仅在该对象上搜索,还会搜索该对象的原型,以及该对象的原型的原型,依此层层的向上搜索,直到找到一个名字匹配的属性或者到达原型链的末尾null
// 构造函数 function Person(name) { this.name = name } // 往原型对象中添加方法 Person.prototype.say = function () { console.log('我是小新') } var p1 = new Person('新哥') console.log(p1) var p2 = new Person('铭桑') console.log(p2) // 通过实例化的对象访问继承的原型 // console.log(p1.__proto__) // console.log(Person.prototype) // 原型对象通过constructor可以访问到构造函数 // console.log(Person.prototype.constructor) // 原型对象下也有一个name属性 Person.prototype.name = 'xxx' // 如果要访问name,首先到当前实例化对象中去寻找,如果找不到会到原型中去查找,这就是原型链的 关系 // 删除当前对象中的name // delete p1.name // console.log(p1.name) // 最早的对象创建 new Object() // 原型对象也是一个对象,就是通过new Object()创建而来 console.log(Person.prototype.__proto__) console.log(Person.prototype.__proto__ === Object.prototype)