关于js原型连的思考
来源:互联网 发布:掌上电脑写卡软件 编辑:程序博客网 时间:2024/06/05 07:37
js中一切皆对象,那么对象是不是应该有对应的类呢?在js中类其实说白了就是function。所有的类都有prototype
这个属性,所有的对象都有__proto__
这个属性。前面说了一切皆对象所以类其实也是对象而且它们对应的类是Function
(这里是不是有疑惑,那么Function这个类对应的类是它自己,嗯,就是这样的), 所以类也具有__proto__
这个属性。所有的对象又继承于Object。
现在我们来验证下:
验证1、 类其实说白了就是function
typeof(Object) // "function"typeof(Function) // "functiontypeof(Array) // "function// 还有其他的如:Number String 或者自己定义的类
验证2、 类其实也是对象而且它对应的类是Function
, Function对应的类是Function
Object instanceof Function //trueArray instanceof Function //trueFunction instanceof Function // trueArray instancof Array //false 这里举一个反例 更好的验证 Function instanceof Function===true
验证3、所有的对象又继承于Object
Object instanceof Object // ture :Object是类,类又是对象,对象又继承于Object所以是trueArray instanceof Object // turevar tmp = {};tmp instanceof Object // ture
原型链
js中原型链就是通过__proto__
这个属性来实现的。
var tmp = [];temp.__proto__=== Array.prototype // truetemp.__proto__.__proto__ === Object.prototype//true
前面说了所有的类都具有 prototype 这个属性。当我们声明一个类的时候我们这样写:
function Dog(name){ this.name=name;}Dog.prototype.say = function(){ alert(this.name+':汪汪汪'); }// 当我们声明一个类他默认会为其增加一个prototype属性里面有constructor 和 __proto__// constructor 指向函数本身作为构造函数,当new的时候会执行这个函数进行对象初始化// __proto__指向Object.prototype// 函数Dog作为构造函数那么这个类的其他属性的定义是不是应该定义在prototype这个对象里面呢,// 所有的new出来Dog对象都会具有(共享)Dog.prototype的所有属性 ,Dog.prototype // {constructor:Dot, __proto__:Object.prototype}var dog = new Dog('哈士奇');dot.say()// 这里就会弹出“哈士奇:汪汪汪”// 下面是new大概的执行过程。var obj = {};Dog.apply(obj,['哈士奇'])obj.__proto__ = Dog.prototype;obj 就是最终返回的哪个dog对象
一些解惑
Object.__proto__
是什么?Object是对象所以具有这个属性,Object对应的类是Function那么Object.__proto__
是不是应该是Function.prototype
。那么Function.prototype又是什么?说到这里那么Object.prototype是什么呢?Object.prototype是js语言定义的最根级的对象。同样的道理Function.prototype可以理解为js语言早已定义好了的一个对象其中包含了对函数的一些定义比如:arguments,callee,apply,bind等…。- Function 和 Object 是最特殊的两个类。
- 之前一直没有提到原始(primitive)类型 如:
var num = 1;var str='hello';var flag = true;
这些不是对象,所有之前的“一切皆对象”这句话不包含这些基本数据类型。可以试试num instanceof Object
会返回false。其实在num 具有Number的一些特性是因为在调用相关Number函数的时候会进行自动装箱。及num.toFixed(2) 其实执行的是 new Number(num).toFixed(2)
阅读全文
0 0
- 关于js原型连的思考
- js 原型的思考
- js 原型连
- 关于js连等赋值的问题
- 关于 javascript中原型和对象的在思考
- js关于原型构造函数和原型链的理解
- 关于js原型链 原型的个人理解
- Js关于原型以及原型链的详细介绍
- 关于JS原型对象的创建
- 关于js高级的原型介绍
- 关于js原型继承的理解
- 关于js原型继承
- 关于JS原型链
- zookeeper的重连思考
- 关于前端js搭建的思考
- 关于js的特性慢慢思考
- JS关于this的思考和总结
- 关于js连等赋值
- pycharm修改pip源为清华源-提高下载速度
- git 分支切换和 提交代码到远程分支 撤销add reset 撤销修改
- 火车票购票系统模拟
- 文件的存取
- 通过注解的方式向DAO中注入Sessionfactory
- 关于js原型连的思考
- hihocoder offer收割第一场
- 测试皮肤
- PullToRefresh(上拉加载,下拉刷新)基本使用
- 开学来的总结
- 游戏《孢子》的思考 —— Marching Cube算法
- 对象的访问方式
- 598. Range Addition II
- 处理大数据运算的利器 — 位图原理以及设计