完全理解JavaScript中的prototype、__proto__

虽然在JavaScript里一切皆对象,但为了理解原型链系统,咱们须要将JavaScript的对象分为对象和函数两大类。在此基础上,JavaScript的原型链逻辑听从如下通用规则:函数

  • 对象有__proto__属性,函数有prototype属性;
  • 对象由函数生成;
  • 生成对象时,对象的__proto__属性指向函数的prototype属性。

在没有手动修改__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,这个属性包含了一个指针,指回原构造函数。对象

相关文章
相关标签/搜索