上一节中讲过javascirpt中每一个函数都有一个prototype属性,即原型对象,它是一个实例属性,这里补充一点,javascirpt中每一个对象都有一个属性__proto__,可称为隐式原型,隐式原型指向创建这个对象的函数的prototype
1 每个对象都有一个__proto__,函数是一个对象,函数的__proto__ 指向什么?
自定义函数的由 Function 创建,是javascirpt内置的函数,所以自定义函数的__proto__指向Function的prototype
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName;
this.sayName = function () {
alert(this.name);
};
}
Person.__proto__ === Function.prototype;//true
2 每个函数都有一个prototype属性,这个属性值是一个对象,即原型对象,那么函数的原型对象的__proto__指向什么?
实际上自定义函数的prototype对象是由Object创建的,以下代码验证:
Person.prototype.__proto__===Object.prototype; //true
3 Object是一个构造函数有prototype属性,js中函数是一个对象有__proto__属性,那么Object的__proto__指向什么?Object的原型(也是一个对象,对象都有一个__proto__属性)的__proto__指向什么?
1 Object由Function创建,对象的___proto__总是指向创建这个对象的原型,因此Object.__proto__指向Function.prototype
Object.__proto__===Function.prototype;//true
2 特别的,Object的原型的__proto__ 指向null,即 Object.prototype.__proto__指向null
Object.prototype.__proto__===null;//true
4 Function 也是一个函数,同样也是一个对象,有__proto__和prototype两个属性,那么
//1 Function.__proto__===?
// 由于Function是一个自建函数,Function的__proto__属性指向创建Function对象的函数的原型,
// 因此Function的__proto__指向 Function自身的prototype
Function.__proto__===Function.prototype;//true
//2 Function.prototype.__proto__===?
// Function的原型本质上都是由Object创建,所以
Function.prototype.__proto__===Object.prototype;//true
5 所有的引用类型都默认继承了Object,而 函数的prototype是一个实例属性,因此所有函数的默认原型都是Object的实例
即: 任意函数.prototype.__proto__===Object.prototype; //true