javascript 原型链

本文深入讲解JavaScript中的原型链机制,包括其工作原理、如何利用原型链实现继承及防止方法重复定义等内容。

一、什么是原型链机   

   首先来看一段代码:

 1 var person = {name : "Peter"};
 2 
 3 //Peter
 4 console.log(person.name);
 5 
 6 //undefined
 7 console.log(person.age);
 8 
 9 Object.prototype.age = 100;
10 
11 //100
12 console.log(person.age);

    为什么person.age 可以访问 Object.prototype.age 呢?

这里就要引出原型链了:

  当需要获取一个对象的某个属性或方法时,首先在对象自身查找该属性,找不到的话,会沿着原型链向上查找,直到在某个原型中找到该属性,如果到达原型链顶端依然找不到,则返回undefined.

二、原型链的作用

  1. 面向对象时,继承主要就依靠原型链来实现
  2. 定义构造函数时,使用原型来防止方法的重复定义(静态方法)
  3. ...发挥你的想象

继承实例:

 1 function Father(){ ...}
 2 
 3 function Son(){...}
 4 
 5 var father = new Father();
 6 
 7 //实现继承,所有的son继承自father对象
 8 Son.prototype = father;
 9 
10 var son = new Son();
11 
12 //true
13 son instanceof Father;

 

使用原型来防止方法重复定义:

 1 //使用这种方法来定义构造函数时,每次new Cat都重新创建了一个bite方法
 2 function Cat(){
 3        this.name = "咪咪";
 4        function bite(){...}
 5 }
 6 
 7 //这种方式,在new Dog时,所有实例都用的同一个bite方法
 8 function Dog(){
 9       this.name = "旺财";
10 }
11 
12 Dog.prototype.bite = function(){...}

 

 

三、理解原型链原理

想要理解javascript的原型链机制,首先要有这些概念:

  • 除了5种基本类型(number, string, boolean, null, undefined)外,所有东西都是对象,function也不例外
  • 每个对象都有自己的构造函数
    •   用字面量定义的对象(var obj = {})的构造函数是Object()
    •   所有函数的构造函数都是Function()函数. (Function()也是一个函数,它的构造函数是自己)
    •       new xxx() 的 构造函数为 xxx()
  • 标准中规定, 所有对象都有一个[[proto]]属性,它指向本对象的原型, 通常是不可访问的,但FF和chrome中提供__proto__属性来访问该值

ps:基本数据类型在执行方法时会被转换为对应的包装对象(Number, String, Boolean)

 

接下来,就是原型链的核心了,请注意,核心是[[proto]]

  1. 原型链是根据[[proto]]属性,来遍历所有原型
  2. 每定义一个函数时,都会为该函数对象产生一个prototype属性(注意:与[[proto]]不同,只有函数对象才有,笔者刚学习时老弄混),它的默认值是一个名字与函数名相同的对象 , 这个对象有个属性constructor,指向函数自身(func.prototype.constructor === func)
  3. 所有普通对象(非函数对象)的[[proto]]指向它的构造函数的prototype属性
  4. 所有函数对象(包括Function自己)的[[proto]]都指向Function.prototype属性
  5. 对于prototype属性而言,因为它也是是一个对象,它的[[proto]]都指向Object.prototype属性
  6. Object.prototype的[[proto]]的值为null, 它是原型链的顶端

大家结合文字再看网络上流传的图,进一步的理解原型链.

 

转载于:https://www.cnblogs.com/Joeycs/p/3733930.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值