js原型与原型链

这里有点懵,今天集中整理下首先,网上的名词:


原型: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的原型对象与原型链

猜你喜欢

转载自blog.csdn.net/weixin_38230961/article/details/81455906