基于js中的原型(全面讲解)


Posted in Javascript onSeptember 19, 2017

在讲js的原型之前,必须先了解下Object和Function。

Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。

console.log(Function instanceof Object); // true
console.log(Object instanceof Function); // true

Object 是 Function的实例,而Function是它自己的实例。

console.log(Function.prototype); // ƒ () { [native code] }
console.log(Object.prototype);  // Object

普通对象和函数对象

JavaScript中万物皆对象,但对象之间也是有区别的。分为函数对象和普通对象。

函数对象可以创建普通对象,普通对象没法创建函数对象,普通对象JS世界中最低级的小喽???短厝ㄒ裁挥小?/p>

凡是通过new Function创建的对象都是函数对象,其他都是普通对象(通常通过Object创建),可以通过typeof来判断。

function f1(){};
typeof f1 //"function"


var o1 = new f1();
typeof o1 //"object"

var o2 = {};
typeof o2 //"object"

这边要注意的是下面这两种写法是一样的

function f1(){};  ==  var f1 = new Function();
function f2(a,b){
  alert(a+b);
}

等价于

var f2 = new Function(a,b,"alert(a+b)");

prototype、_proto_和construetor(构造函数)

下面两句话也很重要

1、每一个函数对象都有一个prototype属性,但是普通对象是没有的;

  prototype下面又有个construetor,指向这个函数。

2、每个对象都有一个名为_proto_的内部属性,指向它所对应的构造函数的原型对象,原型链基于_proto_;

好了,开始上代码和例子,建一个普通对象,我们可以看到

1、o的确没有prototype属性

2、o是Object的实例

3、o的__proto__指向Object的prototype

4、Object.prototype.constructor指向Object本身

还可以继续往下延伸......

var o = {};
  console.log(o.prototype); //undefined
  console.log(o instanceof Object); //true
  console.log(o.__proto__ === Object.prototype) //true
  console.log(Object === Object.prototype.constructor) //true 
  console.log(Object.prototype.constructor) //function Object()
console.log(Object.prototype.__proto__); //null

基于js中的原型(全面讲解)

下面来一个函数对象,从下面的例子可以看出

1、demo是函数对象,f1还是普通对象

2、f1是Demo的实例

3、demo的原型prototype的__proto__指向Object的原型prototype,而Object的原型prototyped的__proto__指向null;

function Demo(){};
  var f1 = new Demo();
  console.log(f1.prototype); //undefined
  console.log(f1 instanceof Demo); //true
  console.log(f1.__proto__ === Demo.prototype); //true
  console.log(Demo === Demo.prototype.constructor) ;//true
  console.log(Demo.prototype.__proto__ === Object.prototype) ;//true
  console.log(Object.prototype.__proto__); //null

基于js中的原型(全面讲解)

原型链

javascript中,每个对象都会在内部生成一个proto 属性,当我们访问一个对象属性时,如果这个对象不存在就回去proto 指向的对象里面找,一层一层找下去,这就是javascript原型链的概念。

f1.__proto__ ==> Demo.prototype ==> Demo.prototype.__proto__ ==> Object.prototype ==> Object.prototype.__proto__ ==> null

JS中所有的东西都是对象,所有的东西都由Object衍生而来, 即所有东西原型链的终点指向null

以上这篇基于js中的原型(全面讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript之学会吝啬 精简代码
Apr 25 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
Nov 19 Javascript
Javascript获取表单名称(name)的方法
Apr 02 Javascript
基于jquery实现左右按钮点击的图片切换效果
Jan 27 Javascript
基于jquery animate操作css样式属性小结
Nov 27 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
深入理解JS中的Function.prototype.bind()方法
Oct 11 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
Apr 23 Javascript
JS常见构造模式实例对比分析
Aug 27 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 30 Javascript
vue使用element-ui实现表单验证
Dec 13 Vue.js
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
Node.js+jade抓取博客所有文章生成静态html文件的实例
Sep 19 #Javascript
Node.js中Bootstrap-table的两种分页的实现方法
Sep 18 #Javascript
Node.js 使用递归实现遍历文件夹中所有文件
Sep 18 #Javascript
Node.JS 循环递归复制文件夹目录及其子文件夹下的所有文件
Sep 18 #Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 #Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 #Javascript
十个免费的web前端开发工具详细整理
Sep 18 #Javascript
You might like
php无限分类且支持输出树状图的详细介绍
2013/06/19 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
js数组的操作详解
2013/03/27 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
利用css+原生js制作简单的钟表
2020/04/07 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
老生常谈js-react组件生命周期
2017/05/02 Javascript
JavaScript多线程运行库Nexus.js详解
2017/12/22 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[49:07]VGJ.T vs Optic Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
Html5实现iPhone开机界面示例代码
2013/06/30 HTML / CSS
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
迟到早退检讨书
2014/02/10 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
企业趣味活动方案
2014/08/21 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
维稳工作情况汇报
2014/10/27 职场文书
见习报告格式要求
2014/11/04 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
孝女彩金观后感
2015/06/10 职场文书
开票证明
2015/06/23 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
Python实现天气查询软件
2021/06/07 Python