JavaScript--原型、原型链

2020-06-07  本文已影响0人  阿毛啊726

任何函数都有一个prototype方法,指向这个函数的原型对象(默认是Object空对象),原型对象中有一个属性constructor指向函数对象

function F() {
        this.test1=function () {
            console.log("test1");
        }
    }
console.log(F.prototype.constructor == F); //true

每一个实例对象都有一个proto方法,同样指向函数的原型对象

    var fn=new F()
    console.log(F.prototype);//{constructor: ƒ}
    console.log(fn.__proto__);//{constructor: ƒ}
    console.log(F.prototype == fn.__proto__);//true

显示原型和隐式原型
函数的prototype为显示原型console.log(F.prototype)
实例对象的proto为隐式原型console.log(fn.__proto__)

    console.log(fn.__proto__.__proto__);//F的原型对象实际上是一个 object的实例对象,所以他也有__proto__,到object的原型对象

原型链

原型链是用来查找属性的,查找过程中是按照隐式原型链走。从实例对象开始查找,没有则进入原型对象,没有则进入原型对象的原型对象(函数的原型对象是一个Object的实例对象),最终找到object的原型对象
object的原型对象的proto为null

console.log(Object.prototype.__proto__);//null

所有函数的proto都是相同的,都指向Function的原型函数
因为所有的函数构造过程如下

function F(){}
//等价于
var F=new Function()
//创建了一个Function构造函数的实例对象
        function F() {        };
        function W() {        };
        function Z() {        };
        console.log(F.__proto__ == W.__proto__);//true
        console.log(F.__proto__);//ƒ () { [native code] }
        console.log(W.__proto__);//ƒ () { [native code] }
        console.log(Z.__proto__);//ƒ () { [native code] }

F.proto ==W.proto==Z.proto==Function的原型对象
对于Function,Function的prototype和proto相等,都指向Function的原型对象:
Function函数的生成过程
var Function=new Function()
Function本身是一个构造函数,同时它又是Function的实例对象
因此

console.log(Function.prototype == Function.__proto__); //true

Object 是Function的一个实例,因此

    console.log(Object.__proto__ == Function.__proto__);//true
    console.log(Object.__proto__ == Function.prototype);//true
    console.log(Object.prototype.__proto__);//null
       function F() {

        };
        Object.prototype.a=function () {
            console.log("a()");
        };
        Function.prototype.b=function () {
            console.log("b()");
        };
        var f=new F();
        console.log(f.a);//a()的函数
        console.log(f.b);//undefinde
        console.log(F.a);//a()的函数
        console.log(F.b);//b()的函数
上一篇 下一篇

猜你喜欢

热点阅读