js中一切皆对象,那么对象是不是应该有对应的类呢?在js中类其实说白了就是function。所有的类都有prototype
这个属性,所有的对象都有__proto__
这个属性。前面说了一切皆对象所以类其实也是对象而且它们对应的类是Function
(这里是不是有疑惑,那么Function这个类对应的类是它自己,嗯,就是这样的), 所以类也具有__proto__
这个属性。所有的对象又继承于Object。
现在我们来验证下:
验证1、 类其实说白了就是function
typeof(Object) // "function"
typeof(Function) // "function
typeof(Array) // "function
// 还有其他的如:Number String 或者自己定义的类
验证2、 类其实也是对象而且它对应的类是Function
, Function对应的类是Function
Object instanceof Function //true
Array instanceof Function //true
Function instanceof Function // true
Array instancof Array //false 这里举一个反例 更好的验证 Function instanceof Function===true
验证3、所有的对象又继承于Object
Object instanceof Object // ture :Object是类,类又是对象,对象又继承于Object所以是true
Array instanceof Object // ture
var tmp = {};
tmp instanceof Object // ture
原型链
js中原型链就是通过__proto__
这个属性来实现的。
var tmp = [];
temp.__proto__=== Array.prototype // true
temp.__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)