美文网首页
JS对象分类

JS对象分类

作者: Marshall3572 | 来源:发表于2021-02-26 19:56 被阅读0次

    推荐几篇文章
    ES6新特性总结
    JS 中 proto 和 prototype 存在的意义是什么?
    JS 的 new 到底是干什么的?
    你可以不会 class,但是一定要学会 prototype

    构造函数

    定义:可以构造对象的函数。
    规范:构造函数首字母大写,构造出来的函数首字母小写。

    原型和公用属性的关系

    共有属性的集合就是原型
    X.prototype和x.proto中存的都是地址。
    对象.proto === 构造函数的.prototype

    Object.prototype的原型是什么?
    像Object这种本身就存在的对象,没有原型,其Object.prototype.proto被设置为null

    分类
    有很多对象拥有一样的属性和行为,我们要把他们归为一类。

    在JS中,数组是一个对象。
    let arr = [1,2,3]
    let arr = new Array(1,2,3) //元素为1,2,3
    let arr = new Array(3) //长度为3

    window是由Window构造出来的,window.proto === Window.prototype
    window.Object是由window.Function构造,因为所有函数都是由window.Function构造的。
    那window.Function又是谁构造的呢?
    也是window.Function,其实是浏览器构造了Function,然后指定它的构造者是自己。

    new X()操作帮我们做了很多事情

    • 自动创建一个空对象
    • 自动将该空对象的原型指向 X.prototype(即将 X.prototype 保存的地址复制到空对象.proto 里)
    • 自动将空对象作为 this 来运行构造函数
    • 自动 return this

    class语法

    class中原型的写法

    class Square{
        constructor(width){
            this.width = width
    }
        getArea(){
            return this.width * this.width
    }
    }
    

    总结:
    关于prototype属性,

    • 所有函数一出生就有一个prototype属性
    • 所有prototype一出生就有constructor属性
    • 所有constructor一出生就保存了对应函数的地址
    • 如果一个函数不是构造函数,他依然拥有prototype属性,只不过这个属性暂时没什么用
    • 如果一个对象不是函数,那么这个对象一般来说没有prototype属性,但一定有proto属性。

    关于Object.prototype,

    • Object.prototye 是「Object 构造出来的对象 obj」的原型,即 obj.proto === Object.prototype
    • Object.proto 是 Object 的原型,由于 Object 是函数,而所有函数的原型都是 Function.prototype,所以 Object.proto === Function.prototype
    • Object.prototye 不是 Object 的原型,Object.proto 才是 Object 的原型(还记着之前答过「x.原型 等价于 x.proto」吗,现在只不过是把 x 替换成 Object。很多人都搞不清楚 Object.proto 和 Object.prototype 哪一个才是 Object 的原型,其实只要记住公式就好办了)

    相关文章

      网友评论

          本文标题:JS对象分类

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