只要提到JavaScript中对象的概念,那么必然离不开prototype这个东西。这里自己写点关于prototype的一些理解,以便以后查阅和复习。
何谓prototype,顾名思义,即为原型之意。这里边有一个比较绕的东西,那就是原型链了。
原型链牢记这样的两句话:
Object构造函数的prototype指向的是Object的原型对象
Object原型对象的constructor指向的是Object的构造函数
代码输出如下:
Object.prototype.constructor
// ƒ Object() { [native code] }
//构造函数
Object.constructor
// ƒ Function() { [native code] }
//构造函数
Object.constructor.prototype
// ƒ () { [native code] }
Object.prototype
// 原型对象
Object.prototype.constructor.prototype
//原型对象
Object.constructor.prototype.constructor
ƒ Function() { [native code] }
构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
即:
var obj = new Object();
console.log(Object.prototype.constructor == Object); //true
console.log(Object.prototype == obj.__proto__); //true
console.log(Object.prototype._proto__ == null); //true
任何对象都有一个__proto__属性
任何函数都有一个prototype属性,prototype也是一个对象 ,所以其中也有一个___proto__
这里有一个非常有意思的结果
console.log(Object instanceof Function); //true
console.log(Function instanceof Object); //true
//①构造器Function的构造器是它自身
console.log(Function.constructor=== Function); //true
//②构造器Object的构造器是Function(由此可知所有构造器的constructor都指向Function)
console.log(Object.constructor === Function;) //true
//③构造器Function的__proto__是一个特殊的匿名函数function() {}
console.log(Function.__proto__); //function() {}
//④这个特殊的匿名函数的__proto__指向Object的prototype原型。
console.log(Function.__proto__.__proto__ === Object.prototype); //true
console.log(Object.__proto__.__proto__ === Object.prototype); //true
//⑤Object的__proto__指向Function的prototype,也就是上面③中所述的特殊匿名函数
console.log(Object.__proto__ === Function.prototype); //true
console.log(Function.prototype === Function.__proto__); //true
网友评论