Object.getPrototypeOf()

  1. 返回参数对象的原型

    1. function F(){};
    2. var f = new F();
    3. Object.getPrototypeOf(f) === F.prototype; // true
  2. 几种特殊对象的原型

    1. // 空对象的原型
    2. Object.getPrototypeOf({}) === Object.prototype; // true
    3. // Object.prototype
    4. Object.getPrototypeOf(Object.prototype) === null; // true;
    5. // 函数的原型
    6. function F(){};
    7. Object.getPrototypeOf(f) === Function.prototype;

    Object.setPrototypeOf()

  3. 该方法为参数对象设置原型,返回该参数对象

  4. 接收两个参数,第一个是现有对象,第二个是原型对象

    Object.create()

  5. 通过实例对象生成另外一个实例对象

  6. 该方法接收一个对象为参数,以它为原型,返回一个实例对象 ```javascript // 原型对象 var A = { print: function() { console.log(“hello”); } }; // 实例对象 var B = Object.create(A);

Object.getPrototypeOf(B) === A // true

  1. 3. 生成一个不继承任何属性的对象
  2. ```javascript
  3. Object.create(null);
  1. 该方法可以接收第二个参数,第二个参数是属性描述符对象,会添加到实例对象,作为对象自身的属性

    1. var obj = Object.create({},{
    2. p1: {
    3. value: 123,
    4. enumerable: true,
    5. configurable: true,
    6. writable: true
    7. },
    8. p1: {
    9. value: "abc",
    10. enumerable: true,
    11. configurable: true,
    12. writable: true
    13. }
    14. });

    Object.prototype.isPrototypeOf()

  2. 实例对象的方法,用来判断该对象是否为参数对象的原型

    1. var o1 = {};
    2. var o2 = Object.create(o1);
    3. var o3 = Object.create(o2);
    4. o2.isPrototypeOf(o3);// true;
    5. o1.isPrototypeOf(o1);// true;

    Object.prototypeproto

  3. 返回该对象的原型

  4. 该属性可读写
  5. 只在浏览器环境中存在
  6. 本质是内部属性,不应该对使用者暴露
  7. 应该适用Object.getPrototypeof()和Object.setPrototypeOf()代替

    获取原型对象方法的比较

  8. 获取原型对象的方法:

    • Object.getPrototypeOf()
    • obj.proto
    • obj.constructor.prototype
  9. 三种方法中第一种最靠谱

    Object.getOwnPropertyNames()

  10. 用来获取对象本身的所有属性的键名,不包含继承的属性键名

  11. 返回值是一个数组,数组成员是参数对象本身的所有属性的键名
  12. 对象本身的属性中,有些属性是可以遍历的,有些属性是不可以遍历的;Object.getOwnPropertyNames返回所有键名,不管是否可以遍历

    Object.keys()

  13. Object.keys()只获取可以遍历的属性的键名

    Object.prototype.hasOwnProperty()

  14. 对象实例的hasOwnProperty返回布尔值

  15. 该方法用于判断某个属性是对象自身的还是原型链上的,如果是自身的返回true,否则返回false
  16. hasOwnProperty方法是唯一一个处理对象属性时,不会遍历原型链的方法

    in

  17. in运算符返回一个布尔值,表示一个对象是否具有某个属性

  18. 不会区分属性时对象自身的属性还是继承的属性
  19. in常用检查一个属性是否存在

    for…in

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

    1. var o1 = {p1: 1};
    2. var o2 = Object.create(o1,{
    3. p2: 2,
    4. enumerable: true
    5. });
    6. for (p in o2) {
    7. console.log(p);
    8. }
    9. // p2
    10. // p1
  21. for...in循环中可以通过hasOwnProperty方法来判断获取对象自身的属性

    1. for(var name in object){
    2. if (object.hasOwnProerty(name)){
    3. }
    4. }
  22. 获取对象的所有属性,不管是自身的还是继承的, 也不管是否可枚举

    1. function inheritedPropertyNames(obj){
    2. var props = {};
    3. while(obj){
    4. Object.getOwnPropertyNames(obj).forEach(function(prop){
    5. props[prop] = true
    6. })
    7. obj = Object.getPrototypeOf(obj);
    8. }
    9. return Object.getOwnPropertyNames(props);
    10. }

    对象的拷贝

  23. 拷贝一个对象,分为两个步骤:

  • 拷贝后的对象和原对象具有同样的原型
  • 拷贝后的对象和原来的对象具有相同的实例属性

    1. function copyObject(orig){
    2. var copy = Object.create(Object.getPrototypeOf(orig));
    3. copy = copyOwnPropertiesFrom(copy,orig);
    4. return copy;
    5. }
    6. function copyOwnPropertiesFrom(target,source){
    7. var props = Object.getOwnPropertyNames(source);
    8. props.forEach(function(p) {
    9. var desc = Object.getOwnPropertyDescriptor(source, p);
    10. Object.defineProperty(target,p,desc);
    11. });
    12. return target;
    13. }
  • 另外一种更简单的写法

    1. function copyObject(orig) {
    2. return Object.create(Object.getPrototypeOf(orig),Object.getOwnPropertyDescriptors(orig));
    3. }