Object 常用屬性

一延柠、Object.defineProperty(obj, prop, descriptor);

定義或修改對象的一個(gè)屬性奏路,返回被定義的對象
數(shù)據(jù)描述符和存取描述符不能同時(shí)存在矮嫉,會產(chǎn)生異常

參數(shù):

  • obj:需要定義屬性的目標(biāo)對象
  • prop:屬性名稱
  • descriptor:被定義或修改的屬性描述符

描述符:

configurable 定義該屬性的描述符是否可修改以及該屬性是否可 delete;
_通過 defineProperty 方法定義時(shí)默認(rèn)為 false口芍,顯示聲明賦值定義默認(rèn)為 true;
_若值為 false雇卷,除了writable 可以從 true 改為 false鬓椭, configurable,enumerable关划,writable小染,get,set 都不可再修改贮折;

// 默認(rèn)屬性都為 false裤翩,此時(shí) configurable 為 false,其他屬性都不可修改
var a = {};
Object.defineProperty(a, 'name', { value: 'june' });
Object.defineProperty(a, 'name', { configurable: true }); // TypeError: Cannot redefine property: name
Object.defineProperty(a, 'name', { enumerable: true }); // TypeError: Cannot redefine property: name
Object.defineProperty(a, 'name', { writable: true }); // TypeError: Cannot redefine property: name
Object.defineProperty(a, 'name', { value: 'july' });  // TypeError: Cannot redefine property: name

// configurable 位 false调榄,writable 可從 true 改為 false踊赠,但不可改回去
var a = {};
Object.defineProperty(a, 'name', { configurable: false, writable: true, value: 'june' });
console.log(a.name);  // june
a.name = 'july';
console.log(a.name);  // july
Object.defineProperty(a, 'name', { writable: false });
a.name = 'june';
console.log(a.name);  // july
Object.defineProperty(a, 'name', { writable: true });  // TypeError: Cannot redefine property: name

enumerable 定義該屬性是否可被枚舉;
_通過 defineProperty 方法定義時(shí)默認(rèn)為 false每庆,顯示聲明賦值定義默認(rèn)為 true筐带;
_定義為 false 則不可在 for...inObject.keys() 中被枚舉;

var a = {};
Object.defineProperty(a, 'name', { enumerable: true, value: 'june' });
Object.defineProperty(a, 'age', { enumerable: false, value: 17 });
console.log(a); // {name: "june", age: 17}
for(var i in a) {
  console.log(a[i]);
}
// june

數(shù)據(jù)描述符(構(gòu)造器屬性)

writable 定義該屬性的值是否能被賦值操作改變缤灵;
_通過 defineProperty 方法定義時(shí)默認(rèn)為 false伦籍,顯示聲明賦值定義默認(rèn)為 true;
_定義為 false 后凤价,試圖重新復(fù)制會被忽略鸽斟,不會引發(fā)錯(cuò)誤;

value 定義該屬性的值
_默認(rèn)為 undefined

存取描述符(訪問器屬性)

get 給屬性提供的 getter 方法利诺;
_該方法的返回值被用作屬性值富蓄;
_默認(rèn)為 undefined;

set 給屬性提供的 setter 方法慢逾;
_該方法接收唯一參數(shù)立倍,并將改參數(shù)處理后的新值分配給該屬性灭红;
_默認(rèn)為 undefined;

function Obj() {
    var _age = 17;
    Object.defineProperty(this, 'dbAge', {
        get: function() {
            return _age;
        },
        set: function(newVal) {
            _age = newVal * 2;
        }
    })
}
var obj = new Obj();
console.log(obj.dbAge);  // 17
obj.dbAge = 10;
console.log(obj.dbAge);  // 20

二口注、Object.defineProperties(obj, props);

批量定義一個(gè)對象的屬性变擒,返回被定義的對象

參數(shù):

  • obj:需要定義屬性的目標(biāo)對象
  • 定義屬性及其描述符的對象

兩種描述符的意思同上

三、Object.create(proto[, propertiesObject])

以指定對象為原型寝志,自定義屬性娇斑,創(chuàng)建一個(gè)新對象
返回新創(chuàng)建的對象

參數(shù)

  • proto:新對象的原型對象
  • propertiesObject:添加到新創(chuàng)建對象上的屬性及其描述符,寫法對應(yīng) Object.defineProperties() 的第二個(gè)參數(shù)材部;

注意:
若 proto 參數(shù)不是一個(gè) null 或 Object毫缆,則拋出一個(gè) TypeError 異常

例子:
單式繼承:

function Shape() {  // 父類
  this.x = 0;
  this.y = 0;
}
Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Shape moved.');
};

function Rectangle() {  // 子類
  Shape.call(this);  // 繼承父類實(shí)例屬性
  this.z = 0;
}

Rectangle.prototype = Object.create(Shape.prototype, {
  // 以父類原型對象為原型,新添加屬性乐导,創(chuàng)建對象
  // 相當(dāng)于父類的空實(shí)例苦丁,再添加自定義屬性
  // 將新創(chuàng)建的對象作為子類的原型對象
  getRectangle: {
    value: function() { console.log('i am getRectangle') },
    configurable: true,
    enumerable: false,
    writable: true
  }
});
// 修改子類原型對象的構(gòu)造函數(shù)指向
Rectangle.prototype.constructor = Rectangle;
var rect = new Rectangle();

多個(gè)繼承:

function Sup1() {
  this.sup1 = 'sup1';
}
function Sup2() {
  this.sup2 = 'sup2';
}
function Sub() {
  Sup1.call(this);
  Sup2.call(this);
}
Sub.prototype = Object.create(Sup1.prototype);
// 此處是將第二個(gè)父類的原型屬性拷貝到子類原型對象,因?yàn)槭菧\拷貝物臂,故雖與第一個(gè)父類的繼承有點(diǎn)區(qū)別旺拉,但無傷大雅
Object.assign(Sub.prototype, Sup2.prototype);
Sub.prototype.constructor = Sub;
Sub.prototype.myMethod = function() {
  // do some thing
}

Polyfill:

if(typeof Object.create !=="function") {
  Object.create = function(proto, propertiesObject) {
    if (typeof proto !=='object' && typeof proto !== 'function') {
      throw new TypeError('Object prototype may only be an Object: ' + proto);
    } else if (typeof proto === null) {
      throw new Error("This browser's implementation of Object.create is a shim anddoesn't support 'null' as the first argument.")
    }
    function F() {};
    F.prototype = proto;
    return new F();
  }
}

1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棵磷,隨后出現(xiàn)的幾起案子蛾狗,更是在濱河造成了極大的恐慌,老刑警劉巖泽本,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淘太,死亡現(xiàn)場離奇詭異,居然都是意外死亡规丽,警方通過查閱死者的電腦和手機(jī)蒲牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赌莺,“玉大人冰抢,你說我怎么就攤上這事∷蚁粒” “怎么了挎扰?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巢音。 經(jīng)常有香客問我遵倦,道長,這世上最難降的妖魔是什么官撼? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任梧躺,我火速辦了婚禮,結(jié)果婚禮上傲绣,老公的妹妹穿的比我還像新娘掠哥。我一直安慰自己巩踏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布续搀。 她就那樣靜靜地躺著塞琼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禁舷。 梳的紋絲不亂的頭發(fā)上彪杉,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音牵咙,去河邊找鬼在讶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛霜大,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播革答,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼战坤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了残拐?” 一聲冷哼從身側(cè)響起途茫,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溪食,沒想到半個(gè)月后囊卜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡错沃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年栅组,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢析。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡玉掸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醒叁,到底是詐尸還是另有隱情司浪,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布把沼,位于F島的核電站啊易,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饮睬。R本人自食惡果不足惜租谈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续捂。 院中可真熱鬧垦垂,春花似錦宦搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至页慷,卻和暖如春憔足,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酒繁。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工滓彰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人州袒。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓揭绑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親郎哭。 傳聞我的和親對象是個(gè)殘疾皇子他匪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355