关于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对象

一些解惑

  1. Object.__proto__ 是什么?Object是对象所以具有这个属性,Object对应的类是Function那么Object.__proto__ 是不是应该是 Function.prototype。那么Function.prototype又是什么?说到这里那么Object.prototype是什么呢?Object.prototype是js语言定义的最根级的对象。同样的道理Function.prototype可以理解为js语言早已定义好了的一个对象其中包含了对函数的一些定义比如:arguments,callee,apply,bind等…。
  2. Function 和 Object 是最特殊的两个类。
  3. 之前一直没有提到原始(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)
原创粉丝点击