这里有点懵,今天集中整理下首先,网上的名词:
原型:prototype
原型链:__proto__
构造器函数:如下 Person()
构造器:构造器(constructor)是对象的一个属性,为只读。
function Person(name, age, job){//构造器函数
this.name = name;
this.age = age;
this.job = job;
}
p = new Person(name, age, job);
console.log(Person.prototype === p.__proto__);//true
console.log(Person.prototype.constructor === Person);//true
console.log(p.constructor === Person);//true
每个对象(包括函数、函数的prototype对象)都有一个__proto__属性,她指向创建该对象的函数的prototype属性。用公式表示,如下:
console.log(p.__proto__ === Person.prototype);//true
注意:通过Object.create()创建的对象不适用此公式!
只有函数function才具有prototype属性。这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。用公式表示,如下:
console.log(Person.prototype.constructor === Person);//true
prototype 属性使您有能力向对象添加属性和方法
function employee(name,job,born){
this.name=name;
this.job=job;
this.born=born;
}
var bill=new employee("Bill Gates","Engineer",1985);
employee.prototype.salary=null;
bill.salary=20000;
document.write(bill.salary);//20000
由于__proto__是任何对象都有的属性,而js里万物皆对象,所以会形成一条__proto__连起来的链条,递归访问__proto__必须最终到头,并且值是null
当js引擎查找对象的属性时,先查找对象本身是否存在该属性,如果不存在,会在原型链上查找,但不会查找自身的prototype
有点类似类属性、对象属性的区别..呵,很容易混。具体区别,见三张图搞懂JavaScript的原型对象与原型链