javascript筆記3:創(chuàng)建對象

創(chuàng)建對象

1.工廠模式 用函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(jié).
function createPerson(name,age,job) {
    let  o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function () {
        console.log(this.name);
    };
    return o;

}

let person1=createPerson('Nicholas',29,'Software Enginner');
let person2=createPerson('Greg',27,'Doctor');
person1.sayName();
person2.sayName();

缺點(diǎn) 沒有解決對象識(shí)別的問題(即怎么知道一個(gè)對象的類型);

2構(gòu)造函數(shù)模式
function Person(name,age,job) {
    this.name=name;
    this.age=age;
    this.job=job;
    this.sayName=function () {
        console.log(this.name);
    }// new Function('console.log(this.name)');
}
let p1=new Person('Nicholas',29,'Software Enginner');
p1.sayName();
let p2=new Person('Greg',27,'Doctor');
p2.sayName();
console.log(typeof p1,p1 instanceof Person,p1 instanceof Object);//ojbct true true
console.log(p1.constructor===Person,p2.constructor===Person);
console.log('name:',p1.sayName===p2.sayName,typeof Person.prototype);//false; object

//當(dāng)構(gòu)造函數(shù)使用
let person=new Person('fubao',30,'Software Enginner');
person.sayName();
//
//Person('Greg',27,'Doctor');
//window.sayName();
//在另一個(gè)對象的作用域中調(diào)用
let o=new Object();
Person.call(o,'Kristen',25,'Nurse');
o.sayName();

缺點(diǎn):每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍.

3:原型模式

創(chuàng)建的每個(gè)函數(shù)都一個(gè)prototype(原型)屬性,它是一個(gè)指針,指向一個(gè)對象,這個(gè)對象的用途是包含可以由特定類型的具有實(shí)例共享的屬性和方法.
優(yōu)點(diǎn):可以讓所有對象的實(shí)例共享它所包含的屬性和方法.

function PersonPT() {
    
}
PersonPT.prototype.name='Nicholas';
PersonPT.prototype.age=29;
PersonPT.prototype.job='Software Engineer';
PersonPT.prototype.sayName=function () {
    console.log(this.name);
};
let pson1=new PersonPT();
pson1.sayName();
let pson2=new PersonPT();
pson2.sayName();
console.log('__proto__是原型對象',pson2.__proto__===PersonPT.prototype);//構(gòu)造函數(shù)的原型對象

console.log('sayName',pson1.sayName===pson2.sayName);//true
console.log(PersonPT.prototype.constructor===PersonPT);
console.log(typeof PersonPT.prototype,PersonPT.prototype instanceof Object);
//通過isPrototypeOf方法來確定實(shí)例的原型是否一樣.
console.log(PersonPT.prototype.isPrototypeOf(pson1));
console.log(PersonPT.prototype.isPrototypeOf(pson2));
//獲得[[Prototype]]
console.log(Object.getPrototypeOf(pson1)===PersonPT.prototype);
console.log(Object.getPrototypeOf(pson1).name);
pson1.name='greg';
console.log(pson1.name,pson2.name);
//delete  pson1.name;
//console.log(pson1.name);
//hasOwnProperty()方法可以檢測一個(gè)屬性是存在實(shí)例中,還是存在原型中.
console.log(person1.hasOwnProperty('name'));//true;
delete  person1.name;
console.log(person1.hasOwnProperty('name'));//false;
//確定屬性來自原型而不是對象中
function hasPrototypeProperty(object, name) {
    return !object.hasOwnProperty(name)&&(name in object);
}
//要取得對象上所有可枚舉的實(shí)例屬性,可使用Object.keys()方法
for(let prop in pson1){
    console.log(prop);
}
var keys=Object.keys(PersonPT.prototype);//所有可枚舉的實(shí)例屬性
console.log(keys);
console.log(Object.keys(pson1));
console.log(Object.getOwnPropertyNames(PersonPT.prototype));//所有實(shí)例屬性,是否可枚舉
//3,更簡單的原型語法
function PersonSimple() {

}

PersonSimple.prototype={
    //constructor:PersonSimple,
    name:'Nicholas',
    age:29,
    job:'Software Engineer',
    sayName:function () {
        console.log(this.name);
    }

};//constructor屬性不再指向PersonSimple
let friend=new PersonSimple();
console.log(friend instanceof Object);//true;
console.log(friend instanceof PersonSimple);//true
console.log(friend.constructor===PersonSimple);//false;
console.log(friend.constructor===Object);//true;
//原型的動(dòng)態(tài)性
let personSimple=new PersonSimple();
PersonSimple.prototype.sayHI=()=>{
    console.log('hi');
};
personSimple.sayHI();//hi

原型模式的缺點(diǎn):a.省略了構(gòu)造函數(shù)傳遞初始化參數(shù).b.共享引用類型會(huì)引起問題.

4.組合使用構(gòu)造函數(shù)模式與原型模式. (推薦使用)

構(gòu)造函數(shù)定義實(shí)例屬性,原型模式用于定義方法與共享的屬性.
優(yōu)點(diǎn):實(shí)例都一份自己實(shí)例屬性副本.同時(shí)共享對方法的引用.節(jié)省內(nèi)存.

function PersonMix(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    this.friends=['Shelby','Court'];
}
PersonMix.prototype={
    constructor:PersonMix,
    sayName:function () {
        console.log(this.name);
    }
};

let pm1=new PersonMix('Nicholas',29,'Software Engineer');
let pm2=new PersonMix('Greg',27,'Doctor');
pm1.friends.push('Van');
console.log(pm1.friends);
console.log(pm2.friends);
console.log(pm1.sayName===pm2.sayName);
5.動(dòng)態(tài)原型模式.
function PersonDynamic(name,age,job){
    this.name=name;
    this.age=age;
    this.job=job;
    if(typeof this.sayName!='function'){//動(dòng)態(tài)體現(xiàn)
        PersonDynamic.prototype.sayName=function () {
            console.log(this.name);
        }
    }
}
6.寄生構(gòu)造函數(shù)模式
function PersonCon(name,age,job) {
    let o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function (){console.log(this.name);};
    return o;
}
let f=new PersonCon('fb',30,'SE');
f.sayName();
console.log(f.constructor===PersonCon);
console.log(f.constructor===PersonCon.prototype);

缺點(diǎn):返回對象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性之間沒有關(guān)系.

7.穩(wěn)妥構(gòu)造函數(shù)模式

穩(wěn)妥對象 指的是沒有公共屬性,而且其方法也不引用this的對象.

function PersonWT(name,age,job) {
    let o=new Object();
    o.sayName=function () {
        console.log(name);
    };
    return o;
}

let wt=PersonWT('fb',30,'SE');
wt.sayName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莉掂,一起剝皮案震驚了整個(gè)濱河市析蝴,隨后出現(xiàn)的幾起案子藐翎,更是在濱河造成了極大的恐慌烹植,老刑警劉巖找蜜,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悯森,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绪撵,“玉大人瓢姻,你說我怎么就攤上這事∫粽” “怎么了幻碱?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長细溅。 經(jīng)常有香客問我褥傍,道長,這世上最難降的妖魔是什么喇聊? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任恍风,我火速辦了婚禮,結(jié)果婚禮上承疲,老公的妹妹穿的比我還像新娘邻耕。我一直安慰自己,他們只是感情好燕鸽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布兄世。 她就那樣靜靜地躺著,像睡著了一般啊研。 火紅的嫁衣襯著肌膚如雪御滩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天党远,我揣著相機(jī)與錄音削解,去河邊找鬼。 笑死沟娱,一個(gè)胖子當(dāng)著我的面吹牛氛驮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播济似,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼矫废,長吁一口氣:“原來是場噩夢啊……” “哼盏缤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓖扑,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤唉铜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后律杠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潭流,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年柜去,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灰嫉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诡蜓,死狀恐怖熬甫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔓罚,我是刑警寧澤椿肩,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站豺谈,受9級特大地震影響郑象,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茬末,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一厂榛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丽惭,春花似錦击奶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至换衬,卻和暖如春痰驱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞳浦。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工担映, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叫潦。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓蝇完,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子短蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348