• 原型对象prototype和原型属性[[Prototype]]


    构造器:可以被 new 运算符调用, Boolean,Number,String,Date,RegExp,Error,Function,Array,Object 都是构造器,他们有各自的实现方式。

    比如:var s=new String("test")

    s的 [[Prototype]] 内部属性设定为标准内置的字符串原型对象,它是 String.prototype 的初始值。
    s的 [[Class]] 内部属性设定为 "String"。
    s的 [[Extensible]] 内部属性设定为 true。
    s的 [[PrimitiveValue]] 内部属性设定为 ToString("test")。

    除这些内置全局对象的构造器之外,还有创建的函数对象也可以用new运算符调用,因为在创建函数对象的过程中,设定了其内部属性[[Construct]],同时给它设置一个原型对象,这个原型对象和new Object创建的对象一样。

    这里说明下函数对象的[[call]] ,[[Construct]],
    var f=function(a,b,c){}
    f()调用[[call]]内部属性方法,建立执行环境,返回返回值。
    var ff=new f()调用[[Construct]]内部方法,创建一个空对象,并对其设置内部属性和方法,比如[[Prototype]]属性指向f的prototype。并以该对象为 this 值,调用参数列表,调用f的 [[Call]] 内部属性,如果返回一个对象则返回该对象,否则返回此前创立的空对象。

    所以每个构造器有一个原型对象prototype。

    每个对象都有一个内部属性[[Prototype]],它指向自己的构造函数的原型对象,同理,其构造函数的原型对象也有有一个内部属性[[Prototype]]指向自己的原型对象,这就形成原型链。当然这个原型链不是无穷的,Object的原型对象的[[Prototype]]是null。
    拿Array为例:
    Array的原型是数组原型对象,Array构造器的[[Prototype]]是函数原型对象。
    当var arr=new Array()时,
    arr的内部属性[[Prototype]]指向Array.prototype。

    下面就来验证下:

    var a=Array.call(this,2)
    结果a是长度为2的空数组。其中call方法就继承自 Function.prototype

    arr.push(1);
    push继承自 Array.prototype

    console.log(arr.prototype) //结果为 undefined,可见其没有原型对象了。
    var arrNew=new arr() //TypeError: object is not a function 因为没有内部属性[[Construct]],抛出异常

    再看
    例2:
    var f=function(){}
    console.log(f.prototype) //Object {}
    var ff=new f() //{}对象

  • 相关阅读:
    Android Native Hook技术(一)
    Android Native Hook技术(二)
    Dalvik源码阅读笔记(一)
    Dalvik源码阅读笔记(二)
    Android反调试笔记
    /dev/mem可没那么简单
    jenkins使用邮件功能
    docker 安装 oracle
    jstack
    docker network
  • 原文地址:https://www.cnblogs.com/mufc-go/p/3544852.html
Copyright © 2020-2023  润新知