虽然在JavaScript里一切皆对象,但为了理解原型链系统,咱们须要将JavaScript的对象分为对象和函数两大类。在此基础上,JavaScript的原型链逻辑听从如下通用规则:函数
在没有手动修改__proto__属性的指向时,以上三条即是JavaScript默认原型链指向逻辑。this
一、通常状况:prototype
// 建立空对象时,实际上咱们是用Object函数来生成对象的: var o = {} o.__proto__ === Object.prototype // ==> true // 咱们也能够显式的使用Object函数来建立对象: var o = Object() o.__proto__ === Object.prototype // ==> true // 当咱们使用函数来建立自定义的对象时,上面的规则一样适用: function MyObj(){} typeof MyObj // ==> "function" var mo = new MyObj() mo.__proto__ === MyObj.prototype // ==> true
二、函数对象
既然JavaScript里“一切皆对象”,那函数天然也是对象的一种。对于函数做为对象来讲,上面的规则一样适用:指针
// 函数对象都是由Function函数生成的: >function fn(){} >fn.__proto__ === Function.prototype // ==> true // Function函数自己做为对象时,生成它的函数是他自身! >Function.__proto__ === Function.prototype // ==> true // Object函数既然是函数,那生成它的函数天然是Function函数咯: >Object.__proto__ === Function.prototype // ==> true
来看一个例子:code
function Say(name, age) { this.name = name; this.age = age; } var person = new Say('jone', 30); console.log(person instanceof Say); // ==> true console.log(person.__proto__ === Say.prototype); // ==> true console.log(person.__proto__.constructor === Say.prototype.constructor); // ==> true var obj = {}; console.log(obj.__proto__ == Object.prototype) // ==> true var fn = function() {}; console.log(fn.__proto__ === Function.prototype); // ==> true
js里全部的对象都有__proto__属性(对象,函数),指向构造该对象的构造函数的原型。
只有函数function才具备prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含全部实例共享的属性和方法(咱们把这个对象叫作原型对象)。原型对象也有一个属性,叫作constructor,这个属性包含了一个指针,指回原构造函数。对象