首先我要说一下基本数据类型:null, undefined, number, string,boolean, symbol,object(引用数据类型),因为object是引用数据类型里面是包含数组和函数,对象,一切皆对象,就是继承自 Object,当然只有引用数据类型才是继承了对象。然后先来说一下prototype这个是只有函数才有的属性。
即:对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。所以对象和数组,函数都有__proto__,函数自己还有prototype属性。
var a = {a:1};
a.__proto__=Object.prototype;
// 对象的.__proto__是指向自身构造函数的prototype这样就形成了原型链
因为var a = {a:1};相当于var a = new Object();
```
在我们知道的一句话中有说过一个对象中不存在的属性会沿着原型链进行查找,直到找到,或者遍历原型链顶级结束。
```js
function Super(name){ this.name = name; } Super.prototype.console = function () { console.log(this.name); } var sub = new Super('sub'); sub.console();在这段代码中可以看见我们的sub是没有console方法的,但是却可以调用console这个函数,原因就是sub的构造函数里面的prototype里面是有这个方法的,实例没有的属性或者方法就会在原型链里面找。
function Super(name){ this.name = name; } Object.prototype.console = function () { console.log(this.name); } var sub = new Super('sub'); sub.console();这个就更厉害了发现Super.prototype没有,因为prototype是一个对象所以找到了(相当于Object.__proto__的原型链)是Object.prototype发现里面有我们需要的函数就沿着原型链找到了,那么新的疑问又来了,顶级的原型链在哪里?所以我进行了校验
console.log(Object.prototype.__proto__);//null
是一个null,真是厉害了我的原型,看来走到底了?
var F = function(){}
F.__proto__=>Function.prototype=>Function.prototype.__proto__=>Object.prototype=>Object.prototype.__proto__=>null 这就是一条原型链。但是实际上在我们的Object也是一个构造函数啊,那我们就把应该是继承了Function了啊,因为所以的函数都是继承自Function那么
Object.__proto__ === Function.prototype//true
var F = function(){}; console.log(F.__proto__)
console.log(Function.prototype === Function.__proto__);
//true
同时Fuction.prototype也是对象,
那我们就来发现也会回到顶级原型链,所以对于function和object我们的理解二者是并列的,所以最先有的是
Object.prototype
顶级原型链。
在接下来的博客我会补充new和create的区别哈哈。。。然后prototype是只有函数有,__proto__是函数和对象都有的属性,__proto__指向的都是我们构造函数的prototype连接成了一个原型链。