1.1 函数的原型对象
在JavaScript中,我们创建一个函数A(就是声明一个函数), 那么浏览器就会在内存中创建一个对象B,而且每个函数都默认会有一个属性 prototype 指向了这个对象( 即:prototype的属性的值是这个对象 )。这个对象B就是函数A的原型对象,简称函数的原型。这个原型对象B 默认会有一个属性 constructor 指向了这个函数A ( 意思就是说:constructor属性的值是函数A )。
1.2 函数原型对象的相关总结
1.2.1 每个构造函数都有一个显示原型对象,即prototype 存储的是一个引用值,且默认是一个空的object的对象
1.2.2 每个实例对象上都有一个隐示原型对象,即__proto__ 称之为隐示原型对象
1.2.3 实例对象上的隐示原型对象等于其构造函数的显示原型对象
即我们可以通过下面的相关代码可以看出,上面的实例对象上的隐示原型对象的值和显示原型对象上的值是相等的。
function Person(){
}
//内部相当于执行的是 this.prototype = {}
var person = new Person()
//内部相当于执行的是 this.__proto__ = Person.prototype
console.log(person.__proto__);
console.log(Person.prototype);
console.log(person.__proto__ === Person.prototype);
且我们只需要保持上面的代码不便,即向构造函数的显示原型上添加一个函数,然后通过实例便可以进行相关的访问。且当我们尝试获取实例(new出来的对象)的属性和方式时,首先会在本身的属性和方法中进行查找,找不到的话就通过隐式原型找到显示原型(也就是找到创造这个对象的类),去这里原型上的属性和方法,找不到就会顺着原型链一直向上,如果再找不到的话Object.__proto__就会抛underfind,原因是就是因为Object.__proto__永远指向null。
function Person(){
}
Person.prototype.test = function(){
console.log(123);
}
var person = new Person()
console.log(person.__proto__);
console.log(Person.prototype);
console.log(person.__proto__ === Person.prototype);
person.test()
万变不离其宗,我们只需要记住的是 实例的隐示原型指向的是其构造函数的显示原型
注意的是。不是所有函数的显示原型对象都是指向默认的Object的空对象
例如 Object.prototype instanceof Object 执行出的结果是false
且所有的函数都是Funtion的实例化对象(包含function本身)
Function.__proto__ === Function.prototype
function Person(){
}
Person.prototype.test = function(){
console.log(123);
}
var person = new Person()
console.log(person.__proto__);
console.log(Person.prototype);
console.log(person.__proto__ === Person.prototype);
console.log(Object.prototype instanceof Object);
console.log(Function.__proto__ === Function.prototype);
person.test()