天天看點

Object原型上的toString和hasOwnProperty方法、Object構造函數上的兩個方法Object.is和Object.assign方法

Object構造函數

JavaScript中的所有對象都來自 

Object

;所有對象從

Object.prototype

繼承方法和屬性,盡管它們可能被覆寫。例如,其他構造函數的原型将覆寫 

constructor

 屬性并提供自己的 

toString()

 方法。

Object

 原型對象的更改将傳播到所有對象,除非受到這些更改的屬性和方法将沿原型鍊進一步覆寫。

Object原型上的toString和hasOwnProperty方法、Object構造函數上的兩個方法Object.is和Object.assign方法

Object.prototype對象原型上的方法

Object.prototype

可以為所有 Object 類型的對象添加屬性,對象原型,上面有封裝好的方法。可以供所有的對象繼承使用。

Object原型上的toString和hasOwnProperty方法、Object構造函數上的兩個方法Object.is和Object.assign方法

(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
        }
           

繼續閱讀