Object原型上的toString和hasOwnProperty方法、Object构造函数上的两个方法Object.is和Object.assign方法

Object构造函数

JavaScript中的所有对象都来自 Object;所有对象从Object.prototype继承方法和属性,尽管它们可能被覆盖。例如,其他构造函数的原型将覆盖 constructor 属性并提供自己的 toString() 方法。Object 原型对象的更改将传播到所有对象,除非受到这些更改的属性和方法将沿原型链进一步覆盖。

Object.prototype对象原型上的方法

Object.prototype

可以为所有 Object 类型的对象添加属性,对象原型,上面有封装好的方法。可以供所有的对象继承使用。

(1)Object.prototype.constructor

构造函数 指向Object

(2)Object.prototype.hasOwnProperty

判断是否是自身的属性,所有对象继承该属性,对象可以直接调用hasOwnProperty,来判断对象上是否有某个属性,比如:

        var obj = {name: "zhu"};
        console.log(obj.hasOwnProperty("name")); true

可以结合for in,来遍历获取对象自身的属性和属性值。

 (3)Object.prototype.toString方法

对象原型的该toString方法可以来识别数据类型,而且每个对象也继承了该toString方法,该方法的详细介绍在“数据类型的toString”有介绍

Object上的两个工具方法

(1)Object.assign()浅复制对象  兼容性:Edge12  ES6

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。

Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。该方法使用源对象的[[Get]]和目标对象的[[Set]],所以它会调用相关 getter 和 setter。因此,它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。

如果属性不可写,会引发TypeError,如果在引发错误之前添加了任何属性,则可以更改target对象。

Symbol 类型的属性都会被拷贝,字符串也会作为一个对象进行拷贝。

        var sym = Symbol('foo'); //Symbol(foo)
        var str = "abc";
        var obj = {
            name: "zhu",
            age: 24,
            s: sym
        }
        var dict = Object.assign({},str,obj);
        console.log(dict);  {0: "a", 1: "b", 2: "c", name: "zhu", age: 24, s: Symbol(foo)}
        console.log(sym);  Symbol(foo)

Object.assign()拷贝的是(可枚举)属性值。假如源值是一个对象的引用,它仅仅会复制其引用值。

异常会打断后续的copy,但前面的copy是成功的,比如一个对象,一部分属性已经copy了,发生异常后,后续停止copy,而前面的属性copy成功。

原始类型会被包装,null 和 undefined 会被忽略。注意,只有字符串的包装对象才可能有自身可枚举属性。

(2)Object.is()判断两个值是否相等  Edge12  ES6

 判断两个值是否相同。如果下列任何一项成立,则两个值相同:

  • 两个值都是 undefined
  • 两个值都是 null
  • 两个值都是 true 或者都是 false
  • 两个值是由相同个数的字符按照相同的顺序组成的字符串
  • 两个值指向同一个对象
  • 两个值都是数字并且
    • 都是正零 +0
    • 都是负零 -0
    • 都是 NaN
    • 都是除零和 NaN 外的其它同一个数字

这种相等性判断逻辑和传统的 == 运算不同,== 运算符会对它两边的操作数做隐式类型转换(如果它们类型不同),然后才进行相等性比较,(所以才会有类似 "" == false 等于 true的现象),但 Object.is 不会做这种类型转换。

这与 === 运算符的判定方式也不一样。=== 运算符(和== 运算符)将数字值 -0 和 +0 视为相等,并认为 Number.NaN 不等于 NaN

兼容性:Edge12

兼容性写法:

if (!Object.is) {
  Object.is = function(x, y) {
    // SameValue algorithm
    if (x === y) { // Steps 1-5, 7-10
      // Steps 6.b-6.e: +0 != -0
      return x !== 0 || 1 / x === 1 / y;
    } else {
      // Step 6.a: NaN == NaN
      return x !== x && y !== y;
    }
  };
}

1、ES5的方法,兼容IE9

这两个方法,在“数据属性和访问器属性”中有介绍

(1)Object.defineProperty()

Object.defineProperty(obj, prop, descriptor)

给对象添加一个属性并指定该属性的配置。

(2)Object.defineProperties()

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});

给对象添加多个属性并分别指定它们的配置。

(3)Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符

如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined

比如,

正常的对象属性

o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
 d {
   configurable: true,
   enumerable: true,
   value: 42,
   writable: true
 }

 通过defineProperty设置的对象属性

        o = {};
        Object.defineProperty(o, "baz", {
            value: 8675309,
            writable: false,
            enumerable: false
        });
        d = Object.getOwnPropertyDescriptor(o, "baz");
        d = {
            value: 8675309,
            writable: false,
            enumerable: false,
            configurable: false
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值