js的原型及原型链探究

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

另外附上一张我自己理解的图,大家可以借鉴一下,码的有点慢,先写这一点,有空继续写
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值