Object 对象的相关方法

  • Object.getPrototypeOf()

    • 返回参数对象的原型。
    • 这是获取某对象的原型对象的标准方法。
      • var F = function () {};
        var f = new F();
        Object.getPrototypeOf(f) === F.prototype // true
    • 几种特殊对象的原型
      • // 空对象的原型是 Object.prototype
        Object.getPrototypeOf({}) === Object.prototype // true // Object.prototype 的原型是 null
        Object.getPrototypeOf(Object.prototype) === null // true // 函数的原型是 Function.prototype
        function f() {}
        Object.getPrototypeOf(f) === Function.prototype // true
  • Object.setPrototypeOf()

    • 重新指定 某对象 的原型对象,返回 某对象。
    • 第一参数是 某对象
    • 第二参数是 新的原型对象
      • var a = {};
        var b = {x: 1};
        Object.setPrototypeOf(a, b); Object.getPrototypeOf(a) === b // true
        a.x //

        将对象 a 的原型,设置为对象 b,因此 a 可以共享 b 的属性

    • 模拟 new 创建实例
      • var F = function () {
        this.foo = 'bar';
        }; var f = new F(); // 等同于
        var f = Object.setPrototypeOf({}, F.prototype); // 将一个空对象的原型设为构造函数的prototype属性
        F.call(f); // 将构造函数内部的this绑定这个空对象,然后执行构造函数,使得定义在this上面的方法和属性(上例是this.foo),都转移到这个空对象上
  • Object.create()

    • 很多时候,只能拿到一个实例对象,它可能根本不是由构建函数生成的
    • Object.create() 接收一个实例对象,以它为原型,再创建并返回一个实例对象。
      • // 原型对象
        var A = {
        print: function () {
        console.log('hello');
        }
        }; // 实例对象
        var B = Object.create(A); Object.getPrototypeOf(B) === A // true
        B.print() // hello
        B.print === A.print // true

        以 A 对象为原型,生成了 B 对象。B 继承了 A 的所有属性和方法

    • 如果想要生成一个不继承任何属性(比如没有 toString() 和 valueOf() 方法)的对象,可以将Object.create() 的参数设为null
    • 注意: 参数不能为空,或者不是对象,否则会报错。可以是 null
    • 生成的新对象,动态继承了原型
      • 意味着在原型上添加或修改任何方法,会立刻反映在新对象之上
    • 还可以接受第二个参数。该参数是一个属性描述对象,它所描述的对象属性,会添加到实例对象,作为该对象自身的属性
      • var obj = Object.create({}, {
        p1: {
        value: 123,
        enumerable: true,
        configurable: true,
        writable: true,
        },
        p2: {
        value: 'abc',
        enumerable: true,
        configurable: true,
        writable: true,
        }
        }); // 等同于
        var obj = Object.create({});
        obj.p1 = 123;
        obj.p2 = 'abc';
    • Object.create() 方法生成的对象,继承了它的原型对象的构造函数
      • function A() {}
        var a = new A();
        var b = Object.create(a); b.constructor === A // true
        b instanceof A // true

        上面代码中,b 对象的原型是 a 对象,因此继承了 a 对象的构造函数

  • Object.prototype.isPrototypeOf()

    • 用来判断该对象是否为某对象的原型

      • var o1 = {};
        var o2 = Object.create(o1);
        var o3 = Object.create(o2); o2.isPrototypeOf(o3); // true
        o1.isPrototypeOf(o3); // true
    • 只要实例对象处在参数对象的原型链上,isPrototypeOf() 方法都返回 true
    • 由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自 null 的对象除外
  • Object.prototype.__proto__ Object对象的 实例对象的 隐式原型对象

    • 根据语言标准,__proto__属性只有浏览器才需要部署,其他环境可以没有这个属性
    • 它前后的两根下划线,表明它本质是一个内部属性,不应该对使用者暴露
    • 应该尽量少用这个属性,而是用 Object.getPrototypeof() 和 Object.setPrototypeOf(),进行原型对象的读写操作
    • __proto__ 属性指向当前对象的原型对象,即构造函数的 prototype 属性
  • 获取原型对象的方法的比较

    • 获取实例对象 obj 的原型对象,有三种方法

      • obj.__proto__    只有浏览器才需要部署,其他环境可以不部署
      • obj.constructor.prototype    在手动改变原型对象时,可能会失效
        • 在改变原型对象时,一般要同时设置constructor属性
        • var P = function () {};
          var p = new P(); var C = function () {};
          C.prototype = p;
          C.prototype.constructor = C; var c = new C();
          c.constructor.prototype === p // true
      • Object.getPrototypeOf(obj)    最好的方法
  • Object.getOwnPropertyNames()

    • 返回一个数组,成员是参数对象本身的所有属性的键名(不管是否可以遍历enumerable),但是不包含继承的属性键名
    • 只获取那些可以遍历的属性,使用 Object.keys(某对象) 方法
  • Object.prototype.hasOwnProperty()

    • 用于判断某个属性是否是自身的属性,是返回 true,否则返回 false
    • 是 JavaScript 之中唯一一个处理对象属性时,不会遍历原型链的方法
  • in 运算符

    • 表示一个对象是否具有某个属性。
    • 用于检查一个属性是否存在
    • 不区分该属性是对象自身的属性,还是继承的属性
      'length' in Date    // true
      'toString' in Date // true
  • for(...in...) 循环

    • 获得对象的所有可遍历属性(不管是自身的还是继承的)

      • var o1 = { p1: 123 };
        
        var o2 = Object.create(o1, {
        p2: { value: "abc", enumerable: true }
        }); for (p in o2) {
        console.info(p);
        }
        // p2 自身的属性
        // p1 继承的属性

        为了获得对象自身的属性,可以采用hasOwnProperty方法判断一下

        • for ( var name in object ) {
          if ( object.hasOwnProperty(name) ) {
          console.log(name);
          }
          }
    • 获得对象的所有属性(不管是自身的还是继承的,也不管可否遍历),可以使用下面的函数
      • function inheritedPropertyNames(obj) {
        var props = {};
        while(obj) {
        Object.getOwnPropertyNames(obj).forEach(function(p) {
        props[p] = true;
        });
        obj = Object.getPrototypeOf(obj); // 原型对象的原型对象
        }
        return Object.getOwnPropertyNames(props);
        }

        inheritedPropertyNames(Date);
        // [
        //      "caller",
        //      "constructor",
        //      "toString",
        //      "UTC",
        //      ...
        // ]

        
        
  • 对象的拷贝

    • 如果要拷贝一个对象,需要做到下面两件事情

      • 确保拷贝后的对象,与原对象具有 同样的原型
      • 确保拷贝后的对象,与原对象具有 同样的实例属性
    • 第一种方法
      • function copyOwnPropertiesFrom(new, old) {
        Object.getOwnPropertyNames(old).forEach(function (propKey) {
        var desc = Object.getOwnPropertyDescriptor(old, propKey);
        Object.defineProperty(new, propKey, desc);
        });
        return new;
        } function copyObject(old) {
        var new = Object.create(Object.getPrototypeOf(old));
        copyOwnPropertiesFrom(new, old);
        return new;
        }
    • 第二种更简单的写法,是利用 ES2017 才引入标准的Object.getOwnPropertyDescriptors方法
      • function copyObject(orig) {
        return Object.create(
        Object.getPrototypeOf(orig),
        Object.getOwnPropertyDescriptors(orig)
        );
        }

(80)Wangdao.com第十六天_JavaScript Object 对象的相关方法的更多相关文章

  1. (81)Wangdao.com第十六天_JavaScript 严格模式

    严格模式 除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode).顾名思义,这种模式采用更加严格的 JavaScript 语法 同样的代码,在正常模式和严格模 ...

  2. (82)Wangdao.com第十六天_JavaScript 异步操作

    异步操作 单线程模型 指的是,JavaScript 只在一个线程上运行 也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运 ...

  3. (75)Wangdao.com第十三天_JavaScript 包装对象

    包装对象 所谓“包装对象”,就是分别与数值.字符串.布尔值相对应的Number.String.Boolean三个原生对象 这三个原生对象可以把原始类型的值变成(包装成)对象 var v1 = new ...

  4. (59)Wangdao.com第十天_JavaScript 对象在 栈和堆

    对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值       // 存 对象["属性名"]       // 取 obj["1 ...

  5. (61)Wangdao.com第十天_JavaScript 立即执行函数

    1. 立即执行函数 创建完了就执行,只执行完就不再执行了. ( function(){} )(); 例 ( function(a,b){ alert("Hello ,我是一个匿名函数!&qu ...

  6. (64)Wangdao.com第十天_JavaScript 对象的 toString() 方法改变输出

    JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象);    // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我 ...

  7. (62)Wangdao.com第十天_JavaScript 变量的作用域

    在 js 中有两种作用域:全局作用域,局部作用域. 全局作用域 直接写在 <script> 标签中的变量和方法. 在网页打开时创建,在网页关闭时销毁. 全局作用域有一个全局对象 windo ...

  8. (60)Wangdao.com第十天_JavaScript 函数_作用域_闭包_IIFE_回调函数_eval

    函数        实现特定功能的 n 条语句封装体. 1. 创建一个函数对象 var myFunc = new Function(); // typeof myFunc 将会打印 function ...

  9. (65)Wangdao.com第十天_JavaScript 垃圾回收机制 GC

    垃圾积累过多,致使程序运行缓慢,什么是垃圾? 当堆中某个内容,再也没有指针指向它,我们将再也用不了它,此时就是一个垃圾. 出现这种情况是因为 obj = null; 此时,js 中的垃圾回收机制会自动 ...

随机推荐

  1. dubbo核心要点及下载(dubbo二)

    一.dubbo核心要点 1):服务是围绕服务提供方和服务消费方的,服务提供方实现服务,服务消费方调用服务. 2):服务注册 对于服务提供方它需要发布服务,而由于应用系统的复杂性,服务的数量.类型不断的 ...

  2. mysql/mariadb主从复制

    主从复制简介 MySQL数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MySQL数据库支持单向.双向.链式级联, ...

  3. SQL SERVER 2008 服务器登录名、角色、数据库用户、角色、架构的关系

    sql server登录名.服务器角色.数据库用户.数据库角色.架构区别联系 1.一个数据库用户可以对应多个架构(架构是表容器).架构里面包含的是数据库表. 2.一个数据库角色有可能涉及多个架构.数据 ...

  4. 「WC2018」通道

    没有代码能力... LOJ #2339 Luogu P4220 UOJ #347 题意 给定三棵树$ T1,T2,T3$,求一个点对$ (x,y)$使得$ T1.dist(x,y)+T2.dist(x ...

  5. C语言之路-3-循环

    1.while循环计算数字位数 #include<stdio.h> int main() { ; int x; printf("请输入数字:"); scanf(&quo ...

  6. Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')

    在 Android 中移植一个库(该库 使用了 libstlport )时 产生如下错误: ./obj/local/armeabi/objs/jniWrapper/native.o: In funct ...

  7. Visual studio 编辑combobox程序卡死的问题

    问题描述:使用vs2017开发一个winform小程序,一用combobox就卡死. 问题解决:关闭有道词典的取词功能. 软件开多了,就容易有冲突啊!

  8. 1.arm的linux系统搭建

    从裸板到系统 一般是CPU内部有启动代码,如nuvoton的nuc900系列的芯片内部就有ibr程序,来控制启动过程,在usb启动时负责加载usb驱动,这样在pc端就可以识别到usb设备了,然后通过t ...

  9. SQL入门(4): 嵌入式SQL语言

    本节讲述内容: 1.嵌入式SQL 语言概述 2.变量声明与数据库连接 3.数据集与游标 4.可滚动游标与数据库的增删改 5.状态捕捉以及错误处理机制 (一)嵌入式SQL语言 之前我们所学的都是交互式S ...

  10. lnoi2019游记

    好诡异的省选...... day0: 莫名其妙的订了下午从sy到dl的火车,得五点多才能到,所以.......是不需要试机的吗...... 好吧... 看着停课的jflr们,感觉他们好强啊,像我这种酱 ...