Object.assign(target, ...sources)
Object.assign() 方法用于將所有可枚舉屬性的值從一個(gè)或多個(gè)源對(duì)象復(fù)制到目標(biāo)對(duì)象。它將返回目標(biāo)對(duì)象臼隔。如果目標(biāo)對(duì)象中的屬性具有相同的鍵潘明,則屬性將被源中的屬性覆蓋锄弱。后來(lái)的源的屬性將類(lèi)似地覆蓋早先的屬性。
target目標(biāo)對(duì)象。
sources源對(duì)象。
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1); // { a: 1, b: 2, c: 3 }, 第一個(gè)參數(shù)注意目標(biāo)對(duì)象自身也會(huì)改變闯捎。
Object.create(proto, [propertiesObject])
proto新創(chuàng)建對(duì)象的原型對(duì)象。
propertiesObject可選许溅。如果沒(méi)有指定為 undefined瓤鼻,則是要添加到新創(chuàng)建對(duì)象的可枚舉屬性(即其自身定義的屬性,而不是其原型鏈上的枚舉屬性)對(duì)象的屬性描述符以及相應(yīng)的屬性名稱(chēng)贤重。這些屬性對(duì)應(yīng)Object.defineProperties()的第二個(gè)參數(shù)茬祷。
用 Object.create實(shí)現(xiàn)類(lèi)式繼承
下面的例子演示了如何使用Object.create()來(lái)實(shí)現(xiàn)類(lèi)式繼承。這是一個(gè)所有版本JavaScript都支持的單繼承并蝗。
// Shape - 父類(lèi)(superclass)
function Shape() {
this.x = 0;
this.y = 0;
}
// 父類(lèi)的方法
Shape.prototype.move = function(x, y) {
this.x += x;
this.y += y;
console.info('Shape moved.');
};
// Rectangle - 子類(lèi)(subclass)
function Rectangle() {
Shape.call(this); // call super constructor.
}
// 子類(lèi)續(xù)承父類(lèi)
Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();
console.log('Is rect an instance of Rectangle?',
rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
rect instanceof Shape); // true
rect.move(1, 1); // Outputs, 'Shape moved.'
Object.defineProperty(obj, prop, descriptor)
obj要在其上定義屬性的對(duì)象祭犯。
prop要定義或修改的屬性的名稱(chēng)。
descriptor將被定義或修改的屬性描述符滚停。
configurable
當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí)沃粗,該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除铐刘。默認(rèn)為 false。
enumerable
當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí)影晓,該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中镰吵。默認(rèn)為 false檩禾。
數(shù)據(jù)描述符同時(shí)具有以下可選鍵值:
value
該屬性對(duì)應(yīng)的值“碳溃可以是任何有效的 JavaScript 值(數(shù)值盼产,對(duì)象,函數(shù)等)勺馆。默認(rèn)為 undefined戏售。
writable
當(dāng)且僅當(dāng)該屬性的writable為true時(shí),value才能被賦值運(yùn)算符改變草穆。默認(rèn)為 false灌灾。
存取描述符同時(shí)具有以下可選鍵值:
get
一個(gè)給屬性提供 getter 的方法,如果沒(méi)有 getter 則為 undefined悲柱。該方法返回值被用作屬性值锋喜。默認(rèn)為 undefined。
set
一個(gè)給屬性提供 setter 的方法豌鸡,如果沒(méi)有 setter 則為 undefined嘿般。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性涯冠。默認(rèn)為 undefined炉奴。
var o = {}; // 創(chuàng)建一個(gè)新對(duì)象
// 在對(duì)象中添加一個(gè)屬性與數(shù)據(jù)描述符的示例
Object.defineProperty(o, "a", {
value : 37,
writable : true,
enumerable : true,
configurable : true
});
Object.defineProperties(obj, props)
方法直接在一個(gè)對(duì)象上定義新的屬性或修改現(xiàn)有屬性,并返回該對(duì)象蛇更。
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// etc. etc.
});
Object.entries()
Object.entries()方法返回一個(gè)給定對(duì)象自身可枚舉屬性的鍵值對(duì)數(shù)組瞻赶,其排列與使用 for...in 循環(huán)遍歷該對(duì)象時(shí)返回的順序一致(區(qū)別在于 for-in 循環(huán)也枚舉原型鏈中的屬性)。
const object1 = { foo: 'bar', baz: 42 };
console.log(Object.entries(object1)[1]);
console.log(Object.entries(object1));
// expected output: Array ["baz", 42]
// expected output: Array [ ["foo", "bar"],["baz", 42]]
const object2 = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(object2)[2]);
// expected output: Array ["2", "c"]
const object3 = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.entries(object3)[0]);
// expected output: Array ["2", "b"]
Object.keys(obj)
返回鍵名組成的數(shù)組,不返回原型鏈上的可枚舉屬性械荷。
Object.freeze()
可以?xún)鼋Y(jié)一個(gè)對(duì)象共耍,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性,不能修改其已有屬性的值吨瞎,不能刪除已有屬性痹兜,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性颤诀、可寫(xiě)性字旭。也就是說(shuō),這個(gè)對(duì)象永遠(yuǎn)是不可變的崖叫。該方法返回被凍結(jié)的對(duì)象遗淳。
Object.seal()
不能加新值,可以改舊值心傀。
Object.getOwnPropertyDescriptor(obj, prop)
方法返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符屈暗。(自有屬性指的是直接賦予該對(duì)象的屬性,不需要從原型鏈上進(jìn)行查找的屬性)
var o, d;
o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
// configurable: true,
// enumerable: true,
// get: /*the getter function*/,
// set: undefined
// }
o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
// configurable: true,
// enumerable: true,
// value: 42,
// writable: true
// }
Object.getOwnPropertyDescriptors(obj)
用來(lái)獲取一個(gè)對(duì)象的所有自身屬性的描述符。
Object.getOwnPropertyNames(obj)
返回一個(gè)由指定對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱(chēng)的屬性)組成的數(shù)組养叛。
Object.getPrototypeOf(obj)
返回指定對(duì)象的原型(內(nèi)部[[Prototype]]屬性的值)种呐。
obj.hasOwnProperty(prop)
會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中是否具有指定的屬性弃甥。
prototypeObj.isPrototypeOf(object)
object在該對(duì)象的原型鏈上搜尋
返回值Boolean爽室,表示調(diào)用對(duì)象是否在另一個(gè)對(duì)象的原型鏈上。
peObj 為 undefined 或 null淆攻,會(huì)拋出 TypeError阔墩。
Object.values(obj)
返回一個(gè)數(shù)組,其元素是在對(duì)象上找到的可枚舉屬性值瓶珊。屬性的順序與通過(guò)手動(dòng)循環(huán)對(duì)象的屬性值所給出的順序相同啸箫。
var obj = { foo: "bar", baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
// 類(lèi)數(shù)組對(duì)象
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']
注意:
var obj = { 0: 'a', 1: 'b', 2: { 3: 'c' , 4: 'd' } };
console.log(Object.values(obj));
// ["a", "b", {…}] 內(nèi)置的對(duì)象沒(méi)有擴(kuò)展成數(shù)組
// 隨機(jī)鍵值的類(lèi)數(shù)組對(duì)象
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
// getFoo 是不可枚舉屬性
var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } });
my_obj.foo = "bar";
console.log(Object.values(my_obj)); // ['bar']
// 參數(shù)是非對(duì)象會(huì)轉(zhuǎn)變成對(duì)象
console.log(Object.values("foo")); // ['f', 'o', 'o']