Javascript-原型与原型链

作者: YS909090 | 来源:发表于2019-05-05 09:12 被阅读0次

    简单介绍

    JavaScript 每个对象都拥有一个原型对象,对象以其原型为模板从原型中继承方法和属性;

    原型对象也可能拥有原型,并从中继承方法和属性;一层一层、以此类推,而由这种关系组成的一条链,我们常称为原型链。

    准确地说,这些属性和方法定义在 Object 的构造器函数 constructor 的prototype属性上,而非对象实例本身。

    原型

    在javascript中,函数可以有属性。并且每个函数都有一个特殊的属性[[Prototype]]叫作原型。

    -所有的引用类型(函数,数组,对象),都有一个__proto__的属性, 我们习惯称之为隐式原型;(__proto__并不是规范属性,只是部分浏览器实现了此属性)

    -所有的函数都具有一个prototype的属性,我们习惯称之为显式原型;

    • 所有的引用类型(函数,数组,对象),其 __proto__ 属性都指向其构造函数的 prototypeobj.__proto__ === Object.prototype);

    -拥有prototype属性的对象,在定义函数时就被创建(原型对象)。

    
    function Foo() {}
    
    const foo = new Foo()
    
    foo.__proto__ === Foo.prototype // true
    
    

    原型链

    原型链就是原型的集合,一级一级地往上查找,直到 Object 的原型对象的原型(null);

    
    function Foo() {}
    
    const foo = new Foo()
    
    Object.prototype.test = function() {}
    
    console.log(foo.test) // ƒ () {}
    
    // 此时访问 foo 的 test 方法的历程是
    
    foo.__proto__ === Foo.prototype // true
    
    Foo.prototype.__proto__ === Object.prototype // true
    
    foo.test === Object.prototype.test
    
    Foo.__proto__ === Function.prototype // true
    
    Function.prototype.__proto__ === Object.prototype // true
    
    Object.prototype.__proto__ === null // true
    
    Function.__proto__ === Function.prototype // true
    
    

    从上面我们可以看出,函数对象的 __proto__ 指向 Function.prototype

    与此相同的还有:

    
    Number.__proto__ === Function.prototype  // true
    
    Number.constructor === Function //true
    
    Boolean.__proto__ === Function.prototype // true
    
    Boolean.constructor === Function //true
    
    String.__proto__ === Function.prototype  // true
    
    String.constructor === Function //true
    
    Object.__proto__ === Function.prototype  // true
    
    Object.constructor === Function // true
    
    Function.__proto__ === Function.prototype // true
    
    Function.constructor === Function //true
    
    Array.__proto__ === Function.prototype  // true
    
    Array.constructor === Function //true
    
    RegExp.__proto__ === Function.prototype  // true
    
    RegExp.constructor === Function //true
    
    Error.__proto__ === Function.prototype  // true
    
    Error.constructor === Function //true
    
    Date.__proto__ === Function.prototype    // true
    
    Date.constructor === Function //true
    
    

    相关文章

      网友评论

        本文标题:Javascript-原型与原型链

        本文链接:https://www.haomeiwen.com/subject/yrzqoqtx.html