原型对象prototype和原型属性[[Prototype]]
构造器:可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器,他们有各自的实现方式。
比如:var s=new String("test")
s的 [[Prototype]] 内部属性设定为标准内置的字符串原型对象,它是 String.prototype 的初始值。
s的 [[Class]] 内部属性设定为 "String"。
s的 [[Extensible]] 内部属性设定为 true。
s的 [[PrimitiveValue]] 内部属性设定为 ToString("test")。
除这些内置全局对象的构造器之外,还有创建的函数对象也可以用new运算符调用,因为在创建函数对象的过程中,设定了其内部属性[[Construct]],同时给它设置一个原型对象,这个原型对象和new Object创建的对象一样。
这里说明下函数对象的[[call]] ,[[Construct]],
var f=function(a,b,c){}
f()调用[[call]]内部属性方法,建立执行环境,返回返回值。
var ff=new f()调用[[Construct]]内部方法,创建一个空对象,并对其设置内部属性和方法,比如[[Prototype]]属性指向f的prototype。并以该对象为 this 值,调用参数列表,调用f的 [[Call]] 内部属性,如果返回一个对象则返回该对象,否则返回此前创立的空对象。
所以每个构造器有一个原型对象prototype。
每个对象都有一个内部属性[[Prototype]],它指向自己的构造函数的原型对象,同理,其构造函数的原型对象也有有一个内部属性[[Prototype]]指向自己的原型对象,这就形成原型链。当然这个原型链不是无穷的,Object的原型对象的[[Prototype]]是null。
拿Array为例:
Array的原型是数组原型对象,Array构造器的[[Prototype]]是函数原型对象。
当var arr=new Array()时,
arr的内部属性[[Prototype]]指向Array.prototype。
下面就来验证下:
var a=Array.call(this,2)
结果a是长度为2的空数组。其中call方法就继承自 Function.prototype
arr.push(1);
push继承自 Array.prototype
console.log(arr.prototype) //结果为 undefined,可见其没有原型对象了。
var arrNew=new arr() //TypeError: object is not a function 因为没有内部属性[[Construct]],抛出异常
再看
例2:
var f=function(){}
console.log(f.prototype) //Object {}
var ff=new f() //{}对象
转载于:https://www.cnblogs.com/mufc-go/p/3544852.html
原型对象prototype和原型属性[[Prototype]]相关推荐
- JS原型对象和JS原型链
1.类型与对象: 基本类型:string.number.boolean.object.null.undefined 引用类型:String.Number.Boolean.Object.Function ...
- 彻底理解js中的原型对象和prototype属性
prototype(函数的原型属性) prototype 是一个指向该实例所使用的原型对象的[指针] prototype 是几乎所有的函数(除了某些内建函数)的属性 prototype 不是一个实例的 ...
- 【JavaScript高级教程】JavaScript prototype(原型对象)
所有的 JavaScript 对象都会从一个 prototype(原型对象)中继承属性和方法. function Person(first, last, age, eyecolor) {this.fi ...
- javascript详解函数原型对象prototype与constructor
1.原型模式 首先我们来谈谈prototype属性,也就是原型属性.每当我们创建一个函数时,函数内部都会自动生成一个指针(既自动生成一个属性就是我们说的prototype),这个指针指向指向原型对象, ...
- 理解js的prototype原型对象
我们创建的每一个函数都有一个prototype(原型)属性.这个属性是一个指针,指向一个对象,而这个对象的用途是包括能够由特定类型的全部实例共享的属性和方法.假设依照字面意思来理解,那么prototy ...
- 关于JavaScript的Prototype及原型对象的理解
学习JavaScript时,就一定会涉及到两个概念–prototype,原型对象.自己在做项目时可能无意中使用到,但是却没有真正去了解这个东西,在学会使用的基础上,进一步去理解它会帮助自己吸收到更多不 ...
- JavaScript的prototype(原型)是什么?
JS在设计之初 根本没有类的概念(现在也没有)为了实现实例对象的属性和方法的共享,就给function对象设计流一个prototype的概念,prototype是函数对象上面预设的对象属性. 简单的说 ...
- 35 利用构造函数和原型对象实现继承
技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.概述 ES6之前并没有给我们提供extends继承,我们可以通过构造函数+原型对象模拟 ...
- javascript面向对象系列第一篇——构造函数和原型对象
前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如何用构造函数和原型对象来创建对象 构造函数 构造函数是 ...
最新文章
- MIT 更新最大自然灾害图像数据集,囊括 19 种灾害事件
- 三星S7 android操作系统耗电,2K屏手机玩游戏耗电大、性能渣?三星S7:呵呵
- Hough变换的基本思想
- c语言本身有输入输出语句正确错误,C语言模拟选择题
- nginx 开启gzip压缩--字符串压缩比率很牛叉
- 幼儿使用计算机亮度,使用夜灯会影响孩子的视力?真相究竟是什么
- php再次确认密码,Laravel6.2中用于用户登录的新密码确认流程详解
- Google Kickstart Round.B C. Diverse Subarray
- python 语音识别 中文_python中文语音识别
- 全网最详细的Intel CPU体系结构分析(内核源码)
- 【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器
- 【汇正财经】什么是股权结构?
- 设计模式-装饰器模式 C++
- openlayers绘制自定义点线面样式,带清除功能Vue版
- 用Python编写自动下载网络小说的脚本
- mysql show master status为空值
- Java工程师培训课(十一、新的开始)
- 面试笔记(网易-Java开发实习)
- failed to allocate for range 0: no IP addresses available in range set:
- 数学建模:用SPSS完成主成分分析
热门文章
- java 微信 回复_微信java 开发2 发送文本消息并回复
- 数据生态mysql_数据生态:MySQL复制技术与生产实践
- amd cpu排行_最新AMD CPU排行出炉 E6版3000+夺魁
- 360浏览器查看html文件在哪里,360浏览器8菜单栏怎么弄出来?如何查看网站源代码...
- python参考文献_[zotero/python]库中参考文献条目删除后,清除残留PDF的脚本
- python读取raw图片文件_python读取raw binary图片并提取统计信息的实例
- accept标头 php,解决PHP中缺少“授权”请求标头的问题
- Java Double类详解
- Pycharm最新版本安装教程
- java - 人员分配组合