美文网首页让前端飞web之路
【六】JavaScript对象:你知道全部的对象分类吗?

【六】JavaScript对象:你知道全部的对象分类吗?

作者: alanwhy | 来源:发表于2019-02-13 22:07 被阅读2次

    JavaScript 中的对象分类

    • 宿主对象:由JS宿主环境提供的对象,它们的行完全由宿主环境决定
    • 内置对象:由JS语言提供的对象;
      • 固有对象:由标准规定,随着JS运行时创建而自动创建的对象实例
      • 原生对象:可以由用户通过Array、RegExp等内置构造器或者特殊语法创建的对象
      • 普通对象:由{}语法、Object构造器或者class关键字定义类创建的对象,它能够被原型继承

    1、宿主对象

    在浏览器环境中,我们都知道全局对象时window,window上又有很多属性,如document

    宿主对象也分为固有的和用户可创建的两种,比如document.createElement就可以创建一些dom元素

    宿主也会提供一些构造器,比如可以使用new Image来创建img元素。

    2、内置对象-固有对象

    固有对象在任何JS代码执行前就已经被创建出来了,他们通常扮演者类似基础库的角色。

    ECMA标准为我们提供了一份固有对象表,里面含有150+个固有对象。附链接:https://www.ecma-international.org/ecma-262/9.0/index.html#sec-well-known-intrinsic-objects

    3、内置对象-原生对象

    在JS标准中,提供了30+个构造器,按照不同的应用场景,可以分为以下几类:


    原生对象.png

    通过这些构造器,可以用new运算创建新的对象,几乎所有这些构造器的能力都是无法用纯JS代码实现的,它们也无法用class/extend语法来继承。

    用对象来模拟函数与构造器:函数对象与构造器对象

    事实上,JS为这一类对象预留了私有字段机制,并规定了抽象的函数对象与构造器对象的概念。

    函数对象的定义是:具有call私有字段的对象;
    构造器对象的定义是:具有私有字段construct的对象

    值得一提的是,在ES6之后 => 语法创建的函数仅仅是函数,它们无法被当作构造器使用,如代码:

        new (a => 0) // error
    

    对于用户使用function语法或者Function构造器创建的对象来说,callconstruct行为总是相似的,如:

    function f(){
        return 1;
    }
    var v = f(); // 把 f 作为函数调用
    var o = new f(); // 把 f 作为构造器调用
    

    可以大致认为construct的执行过程如下

    • 以Object.prototype为原型创建一个新对象;
    • 以新对象为this,执行函数的call
    • 如果call的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象

    这个规则会造成一个现象,如果构造器返回了一个新的对象,那么new创建的新对象就变成了一个构造函数之外完全无法访问的对象,一定程度上可以实现”私有“

    function cls(){
        this.a = 100;
        return {
            getValue:() => this.a
        }
    }
    var o = new cls;
    o.getValue(); //100
    //a 在外面永远无法访问到
    

    参考原文:JavaScript对象:你知道全部的对象分类吗?

    相关文章

      网友评论

        本文标题:【六】JavaScript对象:你知道全部的对象分类吗?

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