理解原型与原型链

由于 JavaScript 是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链。

原型:

原型是一个可以被复制(或者叫克隆)的一个类,通过复制原型可以创建一个一模一样的新对象。通俗的说,原型就是一个模板,在设计语言中更准确的说是一个对象模板。

原型链:

在javascript中,所有的对象都拥有一个__proto__属性指向该对象的原型(prototype)。
在下面的代码中,执行console.log(cat.__proto__ )后在控制台可以看到输出了原型(Animal),然后继续执行console.log(Animal.__proto__),控制台打印的结果是function(){},为什么Person的原型是function呢?这是因为Person是一个构造函数,它的本质就是一个函数。在javascript中函数是一等对象。

function Animal( ){}
var cat = new Animal();
console.log(cat.__proto__ === Animal.prototype); //true

console.log(cat.__proto__ ); //Animal
console.log(Animal.__proto__ ); //function(){}

1.实例与原型:
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。举个例子

function Animal(name){};
Animal.prototype.eat='草料';

var dog = new Animal('狗狗');
dog.eat = '粑粑';

console.log(dog.eat);//粑粑
delete dog.eat;
console.log(dog.eat);//草料

//可以看得出来,如果设置了dog.eat,输出的结果就是dog上的eat,把dog.eat删除掉,输出的结果就是prototype上的eat

2.prototype:
用构造函数生成实例对象,每一个实例对象,都有自己的属性和方法的副本,如果没有prototype是无法做到资源共享的,我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个原型对象,这个原型对象中拥有的属性和方法可以被所以实例共享,举个例子:

function Animal(name){
    this.name=name;
    this.type='动物';
};
Animal.prototype.eat='草料';
var dog = new Animal('狗狗');
var cat = new Animal('猫猫');

/*修改的是实例的属性,所以cat.type是不受影响的*/  
dog.type = '金毛';
console.log(dog.type);// 金毛
console.log(cat.type);// 动物 

/*修改原型上面的eat,此时dog.eat和cat.eat都会受到影响*/
Animal.prototype.eat='粑粑';
console.log(dog.eat);// 粑粑
console.log(cat.eat);// 粑粑

3.__proto__
__proto__用来表示实例与实例原型之间的关系,也就是Animal和Animal.prototype之间的关系,
所有的对象(除了null)都拥有一个__proto__属性指向该对象的原型(prototype),如下代码:
console.log(cat.__proto__)输出了原型(Animal),console.log(Animal.__proto__ )输出了function,Animal本质就是一个函数

function Animal( ){}
var cat = new Animal();
console.log(cat.__proto__ === Animal.prototype); //true

console.log(cat.__proto__ ); //Animal
console.log(Animal.__proto__ ); //function(){}

我们除了使用. __ proto __ 链接,还可以使用构造函数属性:
事实上,.__ proto __ === constructor.prototype

4.constructor(构造函数属性)
实例是通过构造函数创建的。实例一创造出来就具有constructor属性(指向构造函数)和__proto__属性(指向原型对象)
构造函数中有一个prototype属性,这个属性是一个指针,指向它的原型对象。
原型对象内部也有一个指针(constructor属性)指向构造函数:Animal === Animal.prototype.constructor; // true

总结:

function Animal( ){}
var cat = new Animal();
console.log(cat.__proto__ === Animal.prototype); //true
console.log(cat.constructor === Animal) // true

console.log(cat.__proto__.constructor === Animal) // true
console.log(Animal.prototype.constructor === Animal) // true


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值