• 标准库》第一章 Object对象


    (本文为阮一峰js标准教程的学习笔记,旨在总结该教程中涉及的知识点大纲及个人所做的一些拓展,方便作为“目录”或者“大纲”复习和查漏补缺,详细内容请参见阮一峰教程原文)

    第三部分 标准库

    ****************第一章 Object对象******************


    一.概述
    1.js原生提供Object对象
    2.首字母大写
    其他所有对象都继承自这个对象,它相当于其他编程语言中基类这一层概念的体现,而其他由此派生的类都是子类
    Object本身也是一个构造函数,可以直接通过它来生成新对象。var o = new Object();




    3.Object作为构造函数使用时,可以接受一个参数。如果该参数是一个对象,则直接返回这个对象;如果是一个原始类型的值,则返回该值对应的包装对象。
    var o1 = {a: 1};
    var o2 = new Object(o1);
    o1 === o2 // true

    new Object(123) instanceof Number
    // true

    注意,通过new Object()的写法生成新对象(这里只讨论不传参的情况),与字面量的写法o = {}是等价的。这句话容易误读


    4.所谓部署就是修改原有的构造函数
    与其他构造函数一样,如果要在Object对象上面部署一个方法,有两种做法。
    (1)部署在Object对象本身
    比如,在Object对象上面定义一个print方法,显示其他对象的内容。

    Object.print = function(o){ console.log(o) };

    var o = new Object();

    Object.print(o)
    // Object


    (2)部署在Object.prototype对象  可以由实例化出来的对象自身调用时重点
    所有构造函数都有一个prototype属性,指向一个原型对象。凡是定义在Object.prototype对象上面的属性和方法,将被所有实例对象共享。(这是非常经典的一句话)

    Object.prototype.print = function(){ console.log(this)};

    var o = new Object();

    o.print() // Object{}

    测试后也可以这样写
     Object.prototype.print=function(e){console.log(e)}
        var o=new Object();
        o.print(o)

    上面代码在Object.prototype定义了一个print方法,然后生成一个Object的实例o。o直接继承了Object.prototype的属性和方法,可以在自身调用它们,也就是说,o对象的print方法实质上是调用Object.prototype.print方法。。

    可以看到,尽管上面两种写法的print方法功能相同,但是用法是不一样的,因此必须区分“构造函数的方法”和“实例对象的方法”。


    5.Object本身当作工具方法使用时,就是不把Object()当成是构造函数调用去搭配new实例化对象,而是把它当作一个可以传参的工具函数

    可以将任意值转为对象。这个方法常用于保证某个值一定是对象。很奇怪为什么它没有出现在上一节强制类型转换的方法中


    规则:如果参数是原始类型的值,Object方法返回对应的包装对象的实例(参见《原始类型的包装对象》一节)。
    示Object函数可以将各种值转为对应的构造函数生成的对象。【未研究】

    Object() // 返回一个空对象
    Object() instanceof Object // true

    Object(undefined) // 返回一个空对象
    Object(undefined) instanceof Object // true

    Object(null) // 返回一个空对象
    Object(null) instanceof Object // true

    上面三条设计的就不好,不传参或者传参undefined,null也能返回空对象,那就等于把Object当成工具函数使用也可以生成{}实例,而且也继承来Object.prototype里面所有属性和方法;那么有new和没有new又会有多大区别呢。【存疑】
    Object.prototype.myfunc=function(){console.log(123)}

    var b=Object();


    b.myfunc()//123



    Object(1) // 等同于 new Number(1)
    Object(1) instanceof Object // true
    Object(1) instanceof Number // true

    Object('foo') // 等同于 new String('foo')
    Object('foo') instanceof Object // true
    Object('foo') instanceof String // true

    Object(true) // 等同于 new Boolean(true)
    Object(true) instanceof Object // true
    Object(true) instanceof Boolean // true


    如果Object方法的参数是一个对象(复合类型),它总是返回原对象。
    var arr = [];
    Object(arr) // 返回原数组
    Object(arr) === arr // true

    var obj = {};
    Object(obj) // 返回原对象
    Object(obj) === obj // true

    var fn = function () {};
    Object(fn) // 返回原函数
    Object(fn) === fn // true

    可以写一个判断变量是否为对象的函数。
    function isObject(value) {
      return value === Object(value);
    }

    isObject([]) // true
    isObject(true) // false


    二.Object 对象的静态方法
    所谓“静态方法”,是指部署在Object对象自身的方法。

    1. Object.keys(),Object.getOwnPropertyNames()遍历对象,返回数组(常用于对象转数组),参数是对象
    该数组的成员都是对象自身的(而不是继承的)所有属性名。

    var o = {
      p1: 123,
      p2: 456
    };

    Object.keys(o)
    // ["p1", "p2"]

    Object.getOwnPropertyNames(o)
    // ["p1", "p2"]
    1.1区别:Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还返回不可枚举的属性名。
    var a = ["Hello", "World"];

    Object.keys(a)
    // ["0", "1"]

    Object.getOwnPropertyNames(a)
    // ["0", "1", "length"]

    ,数组的length属性是不可枚举的属性,所以只出现在Object.getOwnPropertyNames方法的返回结果中。

    由于JavaScript没有提供计算对象属性个数(标准对象属性个数就是看得到的个数,数组会有隐藏掉的自身的属性)的方法,所以可以用这两个方法代替。


    2、其他方法(这一块基本没学)
    (1)对象属性模型的相关方法

        Object.getOwnPropertyDescriptor():获取某个属性的attributes对象。
        Object.defineProperty():通过attributes对象,定义某个属性。
        Object.defineProperties():通过attributes对象,定义多个属性。
        Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称。

    (2)控制对象状态的方法
        Object.preventExtensions():防止对象扩展。
        Object.isExtensible():判断对象是否可扩展。
        Object.seal():禁止对象配置。
        Object.isSealed():判断一个对象是否可配置。
        Object.freeze():冻结一个对象。
        Object.isFrozen():判断一个对象是否被冻结。
    (3)原型链相关方法

        Object.create():该方法可以指定原型对象和属性,返回一个新的对象。是es5当中提供的一种新的创建对象的方法
        Object.getPrototypeOf():获取对象的Prototype对象。


    三.Object对象的实例方法
    除了Object对象本身的方法,还有不少方法是部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法。
    Object实例对象的方法,主要有以下六个。本节介绍前两个方法,其他方法将在后文相关章节介绍。

        valueOf():返回当前对象对应的值。
        toString():返回当前对象对应的字符串形式。
        toLocaleString():返回当前对象对应的本地字符串形式。
        hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。
        isPrototypeOf():判断当前对象是否为另一个对象的原型。
        propertyIsEnumerable():判断某个属性是否可枚举。

    1.Object.prototype.valueOf()

    valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。
    var o = new Object();
    o.valueOf() === o // true

    valueOf方法的主要用途是,JavaScript自动类型转换时会默认调用这个方法
    所以,如果自定义valueOf方法,就可以得到想要的结果。

    var o = new Object();
    o.valueOf = function (){
      return 2;
    };
    就相当于用o.valueOf覆盖了Object.prototype.valueOf。
    这样会修改掉,重绘o继承来的属性valueOf,而不会改变Object.prototype.valueOf()

    2 Object.prototype.toString()
    toString方法的作用是返回一个对象的字符串形式,默认情况下返回类型字符串。
    var o1 = new Object();
    o1.toString() // "[object Object]"

    var o2 = {a:1};
    o2.toString() // "[object Object]"
    上面代码表示,对于一个对象调用toString方法,会返回字符串[object Object],该字符串说明对象的类型。

    字符串[object Object]本身没有太大的用处,但是通过自定义toString方法,可以让对象在自动类型转换时,得到想要的字符串形式。

    数组、字符串、函数、Date对象都分别部署了自己版本的toString方法,覆盖了Object.prototype.toString方法。

    [1, 2, 3].toString() // "1,2,3"

    '123'.toString() // "123"

    (function () {
      return 123;
    }).toString()
    // "function () {
    //   return 123;
    // }"

    (new Date()).toString()
    // "Tue May 10 2016 09:11:31 GMT+0800 (CST)"

    3 toString()应用:判断数据类型
    Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型。

    var o = {};
    o.toString() // "[object Object]"
    上面代码调用空对象的toString方法,结果返回一个字符串object Object,其中第二个Object表示该值的构造函数。这是一个十分有用的判断数据类型的方法。

    实例对象可能会自定义toString方法,覆盖掉Object.prototype.toString方法。通过函数的call方法,可以在任意值上调用Object.prototype.toString方法,帮助我们判断这个值的类型。
    Object.prototype.toString.call(value)

    不同数据类型的Object.prototype.toString方法返回值如下。表示该值的构造函数

        数值:返回[object Number]。
        字符串:返回[object String]。
        布尔值:返回[object Boolean]。
        undefined:返回[object Undefined]。
        null:返回[object Null]。
        数组:返回[object Array]。
        arguments对象:返回[object Arguments]。
        函数:返回[object Function]。
        Error对象:返回[object Error]。
        Date对象:返回[object Date]。
        RegExp对象:返回[object RegExp]。
        其他对象:返回[object Object]。

    Object.prototype.toString.call(2) // "[object Number]"
    Object.prototype.toString.call('') // "[object String]"
    Object.prototype.toString.call(true) // "[object Boolean]"
    Object.prototype.toString.call(undefined) // "[object Undefined]"
    Object.prototype.toString.call(null) // "[object Null]"
    Object.prototype.toString.call(Math) // "[object Math]"
    Object.prototype.toString.call({}) // "[object Object]"
    Object.prototype.toString.call([]) // "[object Array]"




  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/xsfx/p/7125574.html
Copyright © 2020-2023  润新知