1.js中除了原始数据类型 都是对象。
包括函数也是对象,可能类似于C++函数对象把 应该是通过解释器
进行()操作符重载或其他操作, 用的时候把它当函数用就行
但是实际上本质是一个对象
原型也是一个对象,所以也称作原型对象
2. js中所有对象都有 __proto__ 属性,指向他的原型对象
一般原型对象{}内部包含两个必要属性constructor 和__proto__,__proto__指向原型对象的原型对象
3. js中函数对象具有prototype属性
(函数对象可以被当作constructor使用
constructor被翻译成构造器/构造函数)
prototype指向 这个函数实例化出的对象的原型(__proto__)
如果新建一个构造函数 那么他的pototype由解释器自动生成,结构应该是这样的
{
constructor: // 这个构造函数本身
__proto__: Object // 指向Object的"原型对象", 之所以这么指向,是因为这个prototype属性要赋给他实例化出来的对象的__proto__ 所以这么指向
}
4.Object的__proto__属性是null
练习:
问题1:
function a(){}
解释一下a的__proto__属性
答:
a是一个对象,所以a有__proto__属性, 指向a函数对象的原型
a函数对象的原型 是Function函数对象
Funciton函数对象的原型(__proto__属性)是Object函数对象
Object函数对象的原型(__proto__)指向null 即那个原型对象
解释一下a的prototype属性
prototype属性是在初始化函数对象的时候解释器自动加上的,方便new操作符内部实现时的调用
{
constructor://a本身
__proto__:Object
}
问题2为什么要有prototype这个属性?
究其原因,是给解释器内部实现new操作符时使用的,
new操作符的处理函数 可以查看下面资料
资料一:
https://lazy2009.iteye.com/blog/1675059
资料二:
知识点:
Object.create的内部原理:
Object.create =
function
(o) {
var
F =
function
() {};
// 这里给函数prototype属性赋值
F.prototype = o;
return
new
F();
};