美文网首页
JavaScript原型与原型链

JavaScript原型与原型链

作者: 嘁_ | 来源:发表于2019-05-08 18:02 被阅读0次

    1. 构造函数

    // 构造函数 Person()
    function Person(name, gender) {
        this.name = name;
        this.gender = gender;
    }
    
    var person = new Person("林俊杰", "男");
    
    // 最后创建出来的对象实例 person
    person
    
    {
        name: "林俊杰",
        gender: "男"
    }
    

    普通函数 Person(),加上 new 关键字后,就构造了一个对象 person

    • 构造函数的定义就是普通函数加上 new 关键字,并总会返回一个对象

    2. 函数对象

    JS 中的对象分为一般对象和函数对象。那什么是一般对象,什么又是函数对象呢?

    JavaScript 的类型分为基本数据类型和引用数据类型,基本数据类型目前有 6 种(null, undefined, string, number, boolean, Symbol);其余的数据类型都统称为 object 数据类型,其中,包括 Array, Date, Function等,所以函数可以称为函数对象

    3. 原型链

    JavaScript 中的对象,有一个特殊的 [[prototype]] 属性, 其实就是对于其他对象的引用(委托)。当我们在获取一个对象的属性时,如果这个对象上没有这个属性,那么 JS 会沿着对象的 [[prototype]]链 一层一层地去找,最后如果没找到就返回 undefined

    • 这条一层一层的查找属性的方式,就叫做原型链

    4. 原型

    所有对象都有 toString 和 valueOf 属性,那么我们是否有必要给每个对象一个 toString 和 valueOf 呢?可以但是没必要。因为JS每次声明一个对象都要写一次这些方法这样写的话会非常占用内存,所以JS 的做法是把所有的对象共用的属性全部放在heap堆内存的一个对象(共用属性组成的对象),然后让每一个对象的__proto__存储这个「共用属性组成的对象」的地址。而这个共用属性,就是原型

    • 原型的目的就是可以用来减少不必要的内存浪费


      用一张图来解释对象使用函数来进行创建的方法
    • 我们创建的对象的__proto__ 会用来指向原有的String对象,使得我们可以调用String对象的公有属性
    • __proto__是某对象的共用属性的引用,是为了用户使用其共用属性中的方法而存在或使用的
    • prototype 是浏览器写的,本身就存在,是某对象的共同属性的引用,为了不让对象的共用属性因没有被调用而被垃圾回收而存在

    5. 烧脑等式

    var n = new Number(1);
    //var 对象 = new 函数;
    
    //对象的__proto__最终指向某对象的共用属性,构造某对象的函数的prototype也指向某对象的共用属性
    //__proto__ 是对象的属性,prototype是函数的属性
    对象.__proto__ === 函数.prototype
    
    //函数的prototype是对象,这个对象对应的就是最简单的函数Object
    函数.prototype.__proto__ === Object.prototype
    
    //由于函数本身即是函数(最优先被视为函数),也是对象,而函数的构造函数是Function
    函数.__proto__ === Function.prototype
    
    //Function即是对象,也是函数,但他优先是个函数
    Function.__proto__ === Function.prototype
    
    //Function.prototype也是对象,是普通的对象,所以其对应的函数是Object
    Funciton.prototype.__proto__=== Object.prototype
    
    • JS中万物皆可当作对象,所以Function既是函数也是对象

    相关文章

      网友评论

          本文标题:JavaScript原型与原型链

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