1. 函数
函数包含3个属性:
[[Prototype]]:用于构建函数的原型链,内置函数和自定义函数都指向Function.prototype。
__proto__: 访问器属性,用于暴露内部属性[[Prototype]]。
prototype:函数特有的属性,函数构造的对象(实例)使用[[Prototype]]继承该属性。
大多数内置函数(包括Object函数)和自定义函数都指向Function.prototype,它是一个空函数Empty():
Number.__proto__ === Function.prototype
// true
Boolean.__proto__ === Function.prototype
// true
String.__proto__ === Function.prototype
// true
Object.__proto__ === Function.prototype
// true
Function.__proto__ === Function.prototype
// true
Array.__proto__ === Function.prototype
// true
RegExp.__proto__ === Function.prototype
// true
Error.__proto__ === Function.prototype
// true
Date.__proto__ === Function.prototype
// true
异常类:
TypeError.__proto__ === Error //true
ReferenceError.__proto__ === Error //true
2.对象
对象包含两个属性:
[[Prototype]]:用于构建对象的原型链,它继承构造函数的原型prototype。
__proto__: 访问器属性,用于暴露内部属性[[Prototype]]。
函数是对象的子类型,技术上讲,叫做“可调用对象”。函数和对象都是通过[[Prototype]]构建原型链。
3. 构建原型链
Object.create( prototype) : 指定原型对象,创建一个对象链接到原型对象
Object.setPrototypeOf(target,source):将一个target对象链接到source对象
Object.getPrototypeOf(target):查询target对象的直接上级原型
source.isPrototypeOf(target ): source对象是不是target对象的上级原型,不一定是直接上级
var myObj1 = Object.create(Object.prototype);
myObj1.name = "obj1";
var myObj2 = Object.create(myObj1);
myObj2.name = "obj2";
var myObj3 = Object.create(myObj2);
myObj3.name = "obj3";
var myObj4 = {name:"obj4"};
//将对象myObj4链接到myObj3
Object.setPrototypeOf(myObj4,myObj3);
//返回原型链的直接上级myObj3
Object.getPrototypeOf(myObj4);//myObj3
//myObj1是不是myObj4的上级原型(可以不是直接上级)
myObj1.isPrototypeOf(myObj4);//true