1.proto和prototype的区别
javascript权威指南
Every JavaScript object has a second JavaScript object (or null ,but this is rare) associated with it. This second object is known as a prototype, and the first object inherits properties from the prototype.
这句话的意思是每个JS对象一定对应一个原型对象,并从原型对象继承属性和方法。
var one = {x: 1};
var two = new Object();
one.__proto__ === Object.prototype // true
two.__proto__ === Object.prototype // true
one.toString === one.__proto__.toString // true
从上述我们不难得知对象proto属性的值就是它所对应的原型对象
那么什么是prototype,prototype就是原型对象,这个单词的中文的意思是原型,它是函数才具有的属性,比如var s=”字符串”,这个是String实例化对象,这一点毫无争议,下面看下这个代码,你就会明白
console.log(s.__proto__.constructor==String);//true
s的proto属性的值对应的是String的prototype属性,是String的原型对象.proto和prototype的区别简单可以用这张图来表示
那么我们应该实现原型链的继承那,从上面都不难了解到,proto指向的是函数的原型,String.prototype.proto===Object.prototype,也就是说String的原型链的proto属性指向Object的原型,而Object的原型指向null,他们通过proto连起来就像一条长链一样,又是原型对象构成的,所以称之为原型链,原型链上的方法都可以被共用,所以我们的js原生api才能够被正常的使用。
var obj={
name:'小华',
age:'20'
}
//obj是Object的实例化对象__proto__是每个对象都有的一个属性,而prototype是函数才会有的属性!!!
console.log(obj.prototype)//undefined
//obj的原型链指向的是函数的prototype(原型)
console.log(obj.__proto__);//Object({})
//obj的__proto__指向Object.prototype.__proto__的原型链终点是null
console.log(obj.__proto__.__proto__===null)//true
console.log(obj.__proto__===Object.prototype)//true 实例的__proto__指向的是原型
console.log(Object.prototype.constructor===Object)// true 原型的创建者是Object
console.log(obj.__proto__.constructor===Object) //true
console.log(Object.prototype.__proto__===null)//true
// 每一个对象都有__proto__属性,都可以找到它的源头,所以js的内置方法才能够使用
// such as:
var a =6;
console.log(a.__proto__);//Number({})
// a.__proto__的构造者是Number对象
console.log(a.__proto__.constructor)//function Number(){}
//a.__proto__.__proto__的指是object象
console.log(a.__proto__.__proto__);//Object({})
//a.__proto__.__proto__的指是null
console.log(a.__proto__.__proto__.__proto__);
// null 那么它的构造者很显然可以知道就是函数的原型
// 比如下面这个
var s = "123";
// 我们很明显就可以知道s的__proto__的原型是String的prototype原型
console.log(s.__proto__.constructor==String); //true
//所以意思很明显就是说一切的源头都是null,都是不存在的,Object的原型的__proto__指向null
console.log(Object.prototype.__proto__===null)//true
console.log(String.prototype.__proto__===Object.prototype)//true
console.log(Object.prototype.constructor)//true
另外附上一张我自己理解的图,大家可以借鉴一下,码的有点慢,先写这一点,有空继续写