Javascript高級(jí)程序設(shè)計(jì)筆記

Math

Math.max僻爽、Math.min

var array = [11,23,45,800,22,0,33];
Math.max.apply(Math, array); // 800
Math.min.apply(Math, array); // 0

Math.random

/**
* 隨機(jī)獲取一個(gè)整數(shù)(范圍)
* @param {Number} minValue 小值
* @param {maxValue} maxValue 大值
*/
var getRandomRange = function(minValue, maxValue) {
  var degValue = maxValue - minValue + 1;
  return Math.floor(Math.random() * degValue + minValue);
}
var colors = ['green','red','blue','black','purple'];
var color = colors[getRandomRange(0, colors.length - 1)]; // 隨機(jī)獲得數(shù)組中的每項(xiàng)

屬性類型

1哮塞、數(shù)據(jù)類型

  • configurable 表示能否通過delete刪除該屬性 默認(rèn)值true
  • enumerable 表示是否可枚舉 就是 for in 循環(huán)是否可以遍歷到 默認(rèn)值true
  • writable 表示是否可以修改 默認(rèn)值 true
  • value 屬性的數(shù)據(jù)值 默認(rèn)值 undefined
var person = {};
Object.defineProperty(person, 'name', {
    writable: false, // 不可改變
    configurable: false, // 不可刪除
    enumerable: false, // 不可枚舉
    value: 'xiaocheng'
});
console.log(person.name); // xiaocheng
person.name = 'sss';
delete person.name;
console.log(person.name); // xiaocheng

2娃兽、訪問屬性

  • configurable 能否通過刪除屬性從而重新定義 默認(rèn)值true
  • enumerable 能否枚舉澈蟆, for in 循環(huán)返回 默認(rèn)值true
  • get 讀取數(shù)據(jù)時(shí)候調(diào)用 默認(rèn)值 undefined
  • set 在寫入屬性時(shí)調(diào)用 默認(rèn)值 undefined
var book = {
    _year: 2017,
    edition: 1
}
Object.defineProperty(book, 'year', {
    get: function () {
        return this._year;
    },
    set: function (newYear) {
        if (newYear > this._year) {
            this.edition += newYear - this._year;
            this._year = newYear;
        }
    }
});
console.log(book.year); // 2017
book.year = 2019;
console.log(book._year); // 2019
console.log(book.edition); // 3

3叛氨、定義多個(gè)屬性

var book = {};
Object.defineProperties(book, {
    _year: {
        value: 2017,
        writable: true // 不寫無法修改 默認(rèn)為false
    },
    edition: {
        value: 1,
        writable: true
    },
    year: {
        get: function () {
            return this._year;
        },
        set: function (newYear) {
            if (newYear > this._year) {
                this.edition += newYear - this._year;
                this._year = newYear;
            } 
        }
    }
})
console.log(book); // {_year: 2017, edition: 1}
book.year = 2019;
console.log(book); // {_year: 2019, edition: 3} 

讀取屬性

// 承接上面設(shè)置的多屬性
// 數(shù)值屬性
var descriptor = Object.getOwnPropertyDescriptor(book, '_year');
console.log(descriptor); // {value: 2019, writable: true, enumerable: false, configurable: false}
// 對(duì)象屬性
var yearDescriptor = Object.getOwnPropertyDescriptor(book, 'year');
console.log(yearDescriptor); // {enumerable: false, configurable: false}
console.log(yearDescriptor.value); // undefined
console.log(typeof yearDescriptor.set); // function

創(chuàng)建對(duì)象的常用方法

1.工廠模式

function createPerson (name, age, job) {
    var o = new Object();
    o.name = name || 'xiaocheng';
    o.age = age || 24;
    o.job = job || 'coding';
    o.sayName = function () {
        console.log(this.name);
    }
    return o;
}
var person1 = createPerson('張三', 15, '搬磚');
var person2 = createPerson('李四', 16, '服務(wù)員');

2.構(gòu)造函數(shù)模式

function Person (name, age, job) {
  this.name = name || 'xiaocheng';
  this.age = age || 24;
  this.job = job || 'coding';
  this.sayName = function () {
    console.log(this.name);
  }
}
var person1 = new Person('張三', 15, '搬磚');
var person2 = new Person('李四', 16, '服務(wù)員');
var o = new Object();
Person.call(o, '王五', 16, '廚師');
o.sayName(); // 王五

構(gòu)造函數(shù)模式和工程模式的不同
1、沒有顯示的創(chuàng)建對(duì)象
2蔑祟、直接把屬性和方法賦值給了 this 對(duì)象
3、沒有 return

3.原型鏈模式

function Person () {};
Person.prototype.name = 'xiaocheng';
Person.prototype.age = 24;
Person.prototype.job = 'coding';
Person.prototype.sayName = function () {
    console.log(this.name);
}
var person1 = new Person();

特定類型的實(shí)例共享所有屬性和方法
一些判斷方法...
object.hasOwnProperty(name); // 此屬性是否是該對(duì)象的實(shí)例屬性
name in object 判斷屬性是否屬于該對(duì)象 無法區(qū)分是否是實(shí)例屬性還是原型屬性
function hasPrototypeProperty(object, name) {
return !object.hasOwnProperty(name) && (name in object)
} // 判斷是否是原型屬性

獲得可枚舉的實(shí)例屬性 Object.keys(obejct); // 返回值為數(shù)組
function Person () {};
Person.prototype.name = 'xiaocheng';
Person.prototype.age = 24;
Person.prototype.job = 'coding';
Person.prototype.sayName = function () {
    console.log(this.name);
}
console.log(Object.keys(Person.prototype));//  ["name", "age", "job", "sayName"]
var person = new Person();
console.log(Object.keys(person)); // []
person.name = '張三';
person.age = 16;
console.log(Object.keys(person)); // ["name", "age"]
獲得所有實(shí)例屬性 不管它可不可枚舉 Object.getOwnPropertyNames(object) // 返回值為數(shù)組
function Person () {};
Person.prototype.name = 'xiaocheng';
Person.prototype.age = 24;
Person.prototype.job = 'coding';
Person.prototype.sayName = function () {
    console.log(this.name);
}
console.log(Object.getOwnPropertyNames(Person.prototype));//  ["constructor", "name", "age", "job", "sayName"]
var person = new Person();
console.log(Object.getOwnPropertyNames(person)); // []
person.name = '張三';
person.age = 16;
console.log(Object.getOwnPropertyNames(person)); // ["name", "age"]

更簡(jiǎn)單的原型方法

function Person () {};
Person.prototype = {
    constructor: Person,
    name: 'xiaocheng',
    age: 24,
    job: 'coding',
    sayName: function() {
        console.log(this.name)
    }
}
// 但是這樣做 constructor 變成了可枚舉屬性 我們可以用下面的方法
Person.prototype = {
    name: 'xiaocheng',
    age: 24,
    job: 'coding',
    sayName: function() {
        console.log(this.name)
    }
}
// 如果不設(shè)置 constructor 它的構(gòu)造函數(shù)將會(huì)指向 Object
Object.defineProperty(Person.prototype, 'constructor', {
    enumerable:false,
    value: Person 
});
// 現(xiàn)在 constructor 就變成了不可枚舉的屬性了
  1. 組合使用構(gòu)造函數(shù)模式和原型模式
function Person (name, age, job) {
    this.name = name;
    this.age = 24;
    this.job = job;
    this.friends = ['上帝','耶穌'];
}
Person.prototype = {
    constructor: Person,
    sayName: function () {
        console.log(this.name)
    }
};
var person1 = new Person('張三', 15, '搬磚');
var person2 = new Person('李四', 14, '服務(wù)員');
person1.friends.push('如來');
console.log(person1.friends); // ["上帝", "耶穌", "如來"]
console.log(person2.friends); // ["上帝", "耶穌"]
  1. 動(dòng)態(tài)原型模式
function Person (name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    if (typeof this.sayName != 'function') {
        // arguments.callee // 返回正在執(zhí)行的函數(shù)對(duì)象 也就是 Person
        arguments.callee.prototype.sayName = function () {
            console.log(this.name);
        }
    }
}
var person1 = new Person('xiaocheng', 24, 'coding');
person1.sayName(); // xiaocheng
  1. 寄生構(gòu)造模式
function Person (name, age, job) {
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function() {
        console.log(this.name);
    }
    return o;
}
var person = new Person('xiaocheng', 24, 'coding');
person.sayName() // xiaocheng

例子 創(chuàng)建一個(gè)特殊數(shù)組

function SpecialArray () {
    var array = new Array();
    array.push.apply(array, arguments); // 此處 不能寫成 array.push(arguments)
    array.toPipedString = function () {
        return this.join('-');
    };
    return array;
}
var colors = new SpecialArray('red', 'block', 'green');
console.log(colors.toPipedString()); // red-block-green
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沉唠,一起剝皮案震驚了整個(gè)濱河市疆虚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌满葛,老刑警劉巖径簿,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嘀韧,居然都是意外死亡牍帚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門乳蛾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暗赶,“玉大人,你說我怎么就攤上這事肃叶□逅妫” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵因惭,是天一觀的道長(zhǎng)岳锁。 經(jīng)常有香客問我,道長(zhǎng)蹦魔,這世上最難降的妖魔是什么激率? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮勿决,結(jié)果婚禮上乒躺,老公的妹妹穿的比我還像新娘。我一直安慰自己低缩,他們只是感情好嘉冒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咆繁,像睡著了一般讳推。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玩般,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天银觅,我揣著相機(jī)與錄音,去河邊找鬼坏为。 笑死究驴,一個(gè)胖子當(dāng)著我的面吹牛慨仿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纳胧,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼镰吆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了跑慕?” 一聲冷哼從身側(cè)響起万皿,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎核行,沒想到半個(gè)月后牢硅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芝雪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年减余,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惩系。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡位岔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堡牡,到底是詐尸還是另有隱情抒抬,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布晤柄,位于F島的核電站擦剑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏芥颈。R本人自食惡果不足惜惠勒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爬坑。 院中可真熱鬧纠屋,春花似錦、人聲如沸妇垢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯估。三九已至,卻和暖如春吼和,著一層夾襖步出監(jiān)牢的瞬間涨薪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工炫乓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刚夺,地道東北人献丑。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像侠姑,于是被迫代替她去往敵國和親创橄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359