当前位置: 首页 > news >正文

原型和原型链

1.普通对象与函数对象

在JavaScript中,万物皆对象。对象分为普通对象和函数对象,那么怎么区分普通对象和函数对象呢?

function是js中自带的函数对象。通过new function()创建的对象都是函数对象。其他的都是普通对象。

<script>
  var a1 = function(){};
  var a2 = new Function('小明');
  function a3(){};

  var b1 = {};
  var b2 = new Object();
  var b3 = new a3();
  console.log(typeof a1);//function
  console.log(typeof a2);//function
  console.log(typeof a3);//function
  console.log(typeof b1);//object
  console.log(typeof b2);//object
  console.log(typeof b3);//object

</script>

从上面代码中可以看出a1,a2,a3为函数对象,b1,b2,b3为普通对象。

2.原型对象

  在JavaScript中每当定义一个函数对象,对象都会包含一些预定义的属性,每个函数都有一个prototype属性(原型属性),这个属性是一个指针,指向一个对象(原型对象),注:普通对象没有prototype,但有__proto__属性。

现在创建一个函数看看,原型是什么?

<script>
  var test=function(){};
  console.log(test.prototype);//object{}
</script>

我们可以看到原型就是一个空的对象,既然是一个对象,我们就可以为他添加属性和方法。

<script>

  var test=function(){};
  test.prototype.getName=function(){
    return this.name;
  }

</script>

原型对象是用来做什么的呢?主要作用是用于继承。举了例子:

var cart= function(name){
   this.name = name
  };
 cart.prototype.getName = function(){
     return this.name; 
  }
  var myCart= new cart(‘兰博基尼’);
  myCart.getName(); //兰博基尼

我们可以看到,原型对象上添加的属性和方法,在函数创建的实例中依然可以使用,这说明什么?

原型对象中的属性和方法是所有实例共享的。

3.原型链

JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。以上面的例子为例:

<script>
  var test=function(){};
  test.prototype.name="小明";
  test.prototype.sex="男";
  test.prototype.getName=function(){
    console.log(this.name);
  }
  var a1=new test();
  console.log(test.prototype);
  console.log(a1);
</script>

   我们可以看到,test的原型对象和一个实例对象都有一个__proto__对象,但是指向不同,原型对象中的__proto__指向Object,而实例中的__proto__指向内部明叫test的对象,展开这个对象可以看到就是原型对象。就是说每一个实例中有一个__proto__属性指向原型对象。每一个实例的内部都包含一个内部属性__proto__,指向了构造函数的原型,就是这个属性连接了实例和原型对象之间的关系,并且我们知道实例中不包含name属性和getName方法,但是我们却使用了getName(),就是通过这个__proto__属性查找的。

JS在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__的内置属性,用于指向创建它的函数对象的原型对象prototype。

 console.log(zjh.__proto__ === person.prototype) //true

同样,person.prototype对象也有__proto__属性,它指向创建它的函数对象(Object)的prototype

  console.log(person.prototype.__proto__ === Object.prototype) //true

继续,Object.prototype对象也有__proto__属性,但它比较特殊,为null

  console.log(Object.prototype.__proto__) //null

我们把这个有__proto__串起来的直到Object.prototype.__proto__为null的链叫做原型链

4.isPrototypeOf查找原型

使用方法a.isprototypeOf(b),判断对象a是否是实例b__proto__指向的原型对象,如果是返回true,否则返回false。看个例子

 var test = function test(){}
  test.prototype.name = "小明";
  test.prototype.age = "25";
  test.prototype.getName = function(){console.log(this.name);}
  var o1 = new test();

  console.log(test.prototype.isPrototypeOf(o1));//true

五、总结

1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成是真正是靠__proto__ 而非prototype。

 

转载于:https://www.cnblogs.com/wanf/p/7207514.html

相关文章:

  • Linux(ubuntu)下如何安装与卸载软件总结
  • 前端调试的一点新理解
  • Linux(ubuntu)下搭建Java开发环境 - 安装JDK
  • POJ 2585 Window Pains 拓扑排序
  • 【Android Dev Guide - 03】 - Content Providers
  • Coding Pages jekyll 404无法找到静态文件(css,js )
  • Linux(ubuntu)下安装搭建Eclipse开发环境
  • 定时清理两周前的分区上的数据
  • Linux(ubuntu)下搭建Android开发环境
  • C++井字棋游戏,DOS界面版
  • html5 02 随记
  • 复制粘贴惹的祸
  • Spring Boot 揭秘与实战(八) 发布与部署 - 开发热部署
  • Firefox:如何设置Firefox为默认浏览器
  • npm常用功能
  • 03Go 类型总结
  • C学习-枚举(九)
  • echarts的各种常用效果展示
  • HashMap ConcurrentHashMap
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript新鲜事·第5期
  • Java读取Properties文件的六种方法
  • vue2.0项目引入element-ui
  • 服务器之间,相同帐号,实现免密钥登录
  • 聚簇索引和非聚簇索引
  • 模型微调
  • 数据仓库的几种建模方法
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 学习使用ExpressJS 4.0中的新Router
  • 智能合约开发环境搭建及Hello World合约
  • ionic异常记录
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 物件導向與老子思想 (OO)
  • (转)Google的Objective-C编码规范
  • (转)setTimeout 和 setInterval 的区别
  • (转)重识new
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net MVC + EF搭建学生管理系统
  • .NET 分布式技术比较
  • @Import注解详解
  • @RequestMapping用法详解
  • [ IO.File ] FileSystemWatcher
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ACTF2020 新生赛]Include
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BZOJ 1032][JSOI2007]祖码Zuma(区间Dp)