1 为什么 xx.constructor.prototype 可以访问到当前对象的原型。
'str'.constructor.prototype
'str'.constructor 指向当前对象的构造函数
(构造函数).prototype:即函数的prototype 属性
1 函数有prototype属性,所以可以访问到
2 函数的prototype属性会在创建实例的时候作为实例的原型而存在。
所以 'str'.constructor.prototype 就可以访问到当前对象实例的原型。
1
'str'.constructor == String
true.constructor == Boolean
(1).constructor == Number
{}.constructor == Object
[].constructor == Array
function(){}.constructor == Function
2
Array.constructor
Object.constructor
Function.constructor
Number.constructor
String.constructor
Boolean.constructor
result:全部都是:function Function(){}
推论:
内置对象的构造器,全部都是 function Function(){},包括Function本身。
所以js所有的内置对象的构造器都是 function Function(){}
3
Number.__proto__ === Function.prototype // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype // true
Object.__proto__ === Function.prototype // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype // true
RegExp.__proto__ === Function.prototype // true
Error.__proto__ === Function.prototype // true
Date.__proto__ === Function.prototype // true
4
Function.prototype.__proto__ == Object.prototype
Object.prototype.__proto__ == Object.prototype
Number.prototype.__proto__ == Object.prototype
Boolean.prototype.__proto__ == Object.prototype
String.prototype.__proto__ == Object.prototype
Array.prototype.__proto__ == Object.prototype
RegExp.prototype.__proto__ == Object.prototype
Error.prototype.__proto__ == Object.prototype
Date.prototype.__proto__ == Object.prototype
推论:
1 只有函数才有 prototype属性
2 所以上面的 XXX.prototype 中的XXX都是构造函数
3 又有2中的 XXX.__proto__
所以:XXX既可以是内置对象,也可以是构造函数。根据情景判断。
结论: Object的所有实例的原型都是 Object.prototype
Object.constructor == Function
Function.prototype.__proto__ == Object.prototype;
并且:Object.prototype.__proto__ == null;
Prototype
1 js的对象都拥有内部属性 [[prototype]] 指向其原型对象。
[[prototype]] 被称为 原型属性。
2 内部属性不可以直接访问.error: obj[[prototype]],但是可以间接访问 [[prototype]]
a ECMA:标准对象原型访问器Object.getPrototype(object)(到目前为止只有Firefox和chrome实现了此访问器);
b 非标准访问器:__proto__(除了IE)
c obj.constructor.prototype
js的一切皆是对象,所以 函数也是对象.又因为对象拥有内部属性 [[prototype]],所以
函数也拥有内部属性 [[prototype]].
其次:函数同时拥有属性 prototype.prototype属性和 [[prototype]]并非同一个属性。
prototype属性指向一个对象,称为原型对象。
所以:一个函数的原型属性(function’s prototype property ) 和函数实际的原型(prototype)没有关系
原型对象的作用:
当函数fn被用作构造函数时,其所创建的所有实例的 内部属性 [[prototype]] 指向 fn 的 prototype属性。
原型的作用:
1 构建原型链
当对象调用某个方法时,如果其本身不存在此方法,就会往其原型中寻找,直到原型链的顶端。
原型链的作用:
多个实例都需要的方法可以被抽出放到原型中,从而只需要定义一次,实现多个对象共享方法
Constructor
JS的所有对象都拥有constructor属性,指向其构造函数。
函数的原型对象也是对象,所以原型对象也拥有constructor属性。
并且JS定下了规则:
fn.prototype.constructor == fn;
即: 函数的prototype属性的constructor字段,指向当前prototype属性的拥有者,也就是构造函数本身。
由 fn.prototype.constructor == fn;推导出来的结论:
构造函数的实例的 constructor属性 指向其构造函数。
推导:
var a = new fn();
首先在a本身寻找:没有找到 constructor属性.再往原型链向上查找,找到a的原型,也就是 fn.prototype,发现了 constructor属性
所以就相当于 构造函数的实例的 constructor属性始终指向其构造函数。
- 构造函数的prototype和constructor属性
Car.prototype = { name:'BMW', height:1400, long:4900 } function Car(color,owner){ this.color = color ...
- js中prototype,constructor的理解
连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...
- JavaScript中的 prototype 和 constructor
prototype属性 任何js函数都可以用作构造函数, 而构造函数需要用到prototype属性, 因此, 每个js函数F(除了ES5的Function.bind()方法返回的函数外) 都自动拥有 ...
- 怎样理解prototype对象的constructor属性
function Person(name){ this.name = name; } var lilei = new Person("Lilei"); lilei.construc ...
- prototype属性的理解
1.对象:对象是JS的基本数据类型(原始类型(数字.字符串和布尔值),对象类型).对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值. 2.三类JS对象和两类属性: 内 ...
- JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this
1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...
- JavaScript的原型链继承__propt__、prototype、constructor的理解、以及他们之间相互的关系。
回想自己已经工作了有一段时间了,但是自己对JavaScript的原型链.和继承的理解能力没有到位,最近他们彻底的整理并且复习了一遍. 本案例中部分文案来自网络和书籍,如有侵权请联系我,我只是把我的理解 ...
- JS中的prototype、__proto__与constructor属性
作为一名前端工程师,必须搞懂JS中的prototype.__proto__与constructor属性,相信很多初学者对这些属性存在许多困惑,容易把它们混淆,本文旨在帮助大家理清它们之间的关系并彻底搞 ...
- 关于prototype属性的理解
众所周知,prototype是一个属性对象,只要创建一个新函数,就会根据特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.在默认情况下,所有原型对象都会自动获得一个cons ...
随机推荐
- 转载:oracle用户创建及权限设置
权限: create session create table unlimited tablespace connect resource dba 例: #sqlplus /nolog SQL> ...
- 关于surf显示立体图,可视化分析数据
如果想判断一个点(x,y)对应的ZV值是否在平面上方.平面上.平面下方,只要将(x,y)带入方程,得到z. 如果ZV大于>Z,则在平面上方:如果ZV<Z,则在方面下方:若ZV=Z,则在平面 ...
- iOS使用VideoToolbox硬编码录制H264视频
http://blog.csdn.net/shawnkong/article/details/52045894
- #ifdef-#endif的作用及其使用技巧
电脑程序语句,我们可以用它区隔一些与特定头文件.程序库和其他文件版本有关的代码. 1 2 3 #ifdef语句1 //程序2 #endif 可翻译为:如果宏定义了语句1则程序2. 作用:我们可以用它区 ...
- @Deprecated使用技巧
本文转自 http://www.cnblogs.com/hzhuxin/p/4645070.html 我们在做项目时,前期写的类中的一些代码可能由于需求变化的原因需要重写,有时重写时方法的传参和返回值 ...
- 业务逻辑:完成基于CRM地址完全匹配的自动分单业务逻辑
思路: 后台系统的业务接口服务处理接收到的数据并使用Webservice技术来远程调用CRM系统的业务接口服务来进行定区的查询操作,随后从该定区中匹配一个快递员来分配工单并发送短信通知取件 操作步骤: ...
- nginx manager
====================================================@echo offrem 当前bat的作用 echo ==================beg ...
- jQuery插件AjaxFileUpload可以实现ajax文件上传
http://blog.sina.com.cn/s/blog_55e42da60100ocvh.html
- java线程基础知识----java线程模型
转载自http://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html 1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标 ...
- PHP开源系统学习之fluxbb_2
谴责下某位同学,转载了我的上一篇文章,也不给个原文地址,希望这次再来转时能加上. //检查登录,在common.php判断 //cookie串: 2|dc4fab5bb354be5104bae0aff ...