創(chuàng)建對(duì)象foo,并在其原型上聲明屬性x,enumerable值為true,value值為1。
function foo(){}
Object.defineProperty(foo.prototype,'x',{enumerable: true, value: 1});
用?Object.create(object)?創(chuàng)建對(duì)象obj,使其原型指向?qū)ο骹oo的實(shí)例,打印obj發(fā)現(xiàn)是空對(duì)象,但是打印obj.x卻有值。這是為什么呢?其實(shí)一開(kāi)始先在自身查找是否存在指定屬性,沒(méi)有的話會(huì)繼續(xù)往上找,也就是在原型上找,找到則停止,找不到最后則返回null。
我們也可以用?Object.hasOwnProperty(prop)?查看對(duì)象自身屬性中是否具有指定的屬性,如果在對(duì)象自身則返回true,反之返回false。
ps:in操作符能找到原型鏈上的屬性。
var obj = Object.create(new foo());
console.log(obj);? ? ? ? ????//foo {}
console.log(obj.x);? ? ?????//1
console.log('x' in obj);? ? //true
console.log(obj.hasOwnProperty('x')); ???? //false
1、對(duì)象屬性的繼承。
下面的實(shí)例修改之后x的值還是為1,原因是在foo原型定義的x的writable默認(rèn)為false,即只能讀取,不能修改。
console.log(obj.x);? ? ? ? //1
obj.x = 5;? ? ? ? ? ? ? ? ? ? ? //修改x的值
console.log(obj.x);? ? ? ?//1
我們重新修改一下原型的x屬性,可以看到這次x變成5了,不過(guò)他只是在自身創(chuàng)建了個(gè)x屬性,不用原型的x了,我們可以通過(guò)obj.hasOwnProperty('x')知道,然后delete掉對(duì)象自身的x,再打印,x為原型上的屬性,值為1,這就是原型鏈的繼承。我們可以繼承原型上的屬性,同時(shí)也不會(huì)修改到它。
Object.defineProperty(foo.prototype,'x',{enumerable: true, writable: true, value: 1});
console.log(obj.x);? ? ? ? //1
obj.x = 5;? ? ? ? ? ? ? ? ? ? ? //修改x的值
console.log(obj.x);? ? ? ?//5
delete obj.x;? ? ? ? ? ? ? ? //這里刪除自身的x
console.log(obj.x);? ? ? //這里是原型上的x
2、對(duì)象屬性的遍歷
用?Object.defineProperties(obj,props)?在對(duì)象obj上定義新的屬性name和type。
ps: enumerable:是否可遍歷,由于type上設(shè)置了false,所以后面遍歷的時(shí)候沒(méi)有打印type
Object.defineProperties(obj , {
? ? ? ? name: {value: 'Ann', enumerable: true},
? ? ? ? type: {value: 'Object', enumerable: false, writable: true}
});
用Object.keys()和for...in...遍歷查看obj的鍵名,比較一下這兩種方法
Object.keys(obj)? ? ? ? ? ? ? ? ? ? ? ?//["name"]
for(var key in obj){
? ? ? ? console.log(key);? ? ? ? ? ? ? // name,x
}
為什么兩種寫(xiě)法結(jié)果不同呢?
Object.keys()只能遍歷對(duì)象自身的屬性,
for...in...能遍歷原型上面擴(kuò)展的屬性,并且順序不確定,在使用時(shí)得注意!
我們可以用Object.hasOwnProperty(prop) 加個(gè)判斷,改寫(xiě)一下for...in...,讓他只能遍歷自身的屬性。
for(var key in obj){
? ? ? ? if(obj.hasOwnProperty(key)){
? ? ? ? ? ? console.log(key);? ? ? ? //name
? ? ? ? }
? ? }