成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js基礎(chǔ)-八種創(chuàng)建對(duì)象方法

justCoding / 879人閱讀

摘要:如果按照字面意思來(lái)理解,那么就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。

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

Object構(gòu)造函數(shù)

對(duì)象字面量表示

工廠模式

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

原型模式

構(gòu)造函數(shù)模式與原型模式結(jié)合

動(dòng)態(tài)原型模式

寄生構(gòu)造函數(shù)模式

一、Object實(shí)例創(chuàng)建
var person1 = new Object();
person1.name = "bob";
person1.age = "22";
person1.job = "frontend";

person1.sayName = function () {
    console.log(this.name);
}

person1.sayName(); // bob
console.log(person1.age); // 22
二、對(duì)象字面量表示
var person2 = {
    name: "bob",
    age: 22,
    job: "frontend",
    sayName: function () {
        console.log(this.name);
    }
}
person2.sayName(); // bob
三、工廠模式
function createPerson(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 person1 = createPerson("bob", 22, "frontend");
var person2 = createPerson("lynn", 22, "doctor");

console.log(person1.name); // bob
console.log(person2.name); // lynn

優(yōu)點(diǎn):函數(shù)封裝創(chuàng)建對(duì)象,無(wú)需寫(xiě)重復(fù)創(chuàng)建對(duì)象的代碼

缺點(diǎn):沒(méi)有解決對(duì)象識(shí)別的問(wèn)題(怎么樣知道一個(gè)對(duì)象類型)

四、構(gòu)造函數(shù)模式
function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function () {
        console.log(this.name);
    }
    
    /**
     * 與聲明函數(shù)在邏輯上是等價(jià)的
       this.sayName = new Function("console.log(this.name)"); 
    */
}

var person1 = new Person("bob", 22, "frontend");
var person2 = new Person("lynn", 22, "doctor");

console.log(person1.name); // bob
console.log(person2.name); // lynn
優(yōu)點(diǎn):

沒(méi)有顯式地創(chuàng)建對(duì)象

直接將屬性和方法賦給了this對(duì)象

沒(méi)有return語(yǔ)句

缺點(diǎn):

每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍

實(shí)現(xiàn)過(guò)程:

創(chuàng)建新的對(duì)象

將構(gòu)造函數(shù)的作用域賦給新對(duì)象,因此this就指向了這個(gè)對(duì)象

執(zhí)行構(gòu)造函數(shù)的代碼,為這個(gè)對(duì)象添加對(duì)象屬性和方法

返回新的對(duì)象

person1person2分別保存著Person的一個(gè)不同的實(shí)例。這兩個(gè)對(duì)象都有一個(gè)constructor(構(gòu)造函數(shù))屬性,該屬性指向Person

console.log(person1.constructor === Person); // true
console.log(person2.constructor === Person); // true

對(duì)象的constructor屬性最初是用來(lái)標(biāo)識(shí)對(duì)象類型的。但是,提到檢測(cè)對(duì)象類型,還是instanceof操作符要更可靠一些

console.log(person1 instanceof Object); // true
console.log(person1 instanceof Person); // true
console.log(person2 instanceof Object); // true
console.log(person2 instanceof Person); // true

我們?cè)谶@個(gè)例子中創(chuàng)建的所有對(duì)象既是Object的實(shí)例,同時(shí)也是Person的實(shí)例,這一點(diǎn)通過(guò)instanceof操作符可以得到驗(yàn)證,創(chuàng)建自定義的構(gòu)造函數(shù)意味著將來(lái)可以將它的實(shí)例標(biāo)識(shí)為一種特定的類型

可以將構(gòu)造函數(shù)當(dāng)作函數(shù)
// 當(dāng)作構(gòu)造函數(shù)使用
var person = new Person("bob", 22, "frontend");
person.sayName(); //"Nicholas"

// 作為普通函數(shù)調(diào)用
Person("lynn", 22, "doctor"); // 添加到window
window.sayName(); //"Greg"

// 在另一個(gè)對(duì)象的作用域中調(diào)用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse");
o.sayName(); //"Kristen"
缺點(diǎn)優(yōu)化

構(gòu)造函數(shù)創(chuàng)建的對(duì)象方法,實(shí)際上執(zhí)行多次函數(shù)創(chuàng)建,會(huì)導(dǎo)致不同的作用域鏈和標(biāo)識(shí)符解析,如:

console.log(person1.sayName == person2.sayName);  //false

創(chuàng)建兩個(gè)完成同樣任務(wù)的Function實(shí)例的確沒(méi)有必要;況且有this對(duì)象在,根本不用在執(zhí)行代碼前就把函數(shù)綁定到特定對(duì)象上面。因此,大可像下面這樣,通過(guò)把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部來(lái)解決這個(gè)問(wèn)題。

function Person(name, age, job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = sayName;
}

// 把sayName函數(shù)抽離出外部函數(shù)
function sayName() {
    console.log(this.name);
}

存在問(wèn)題:

所有被新創(chuàng)建出來(lái)的對(duì)象,都會(huì)指向全局作用域的sayName函數(shù),如果定義N個(gè)方法,那么就要定義N個(gè)全局的方法,這就造成了封裝性的瓶頸,不過(guò)可以使用原型模式來(lái)解決

五、原型模式
function Person() {
}

Person.prototype.name = "bob";
Person.prototype.age = 22;
Person.prototype.job = "frontend";
Person.prototype.sayName = function () {
    return this.name
}

var person1 = new Person();

console.log(person1.name); // bob
console.log(person1.age); // 22
console.log(person1.job); // frontend
console.log(person1.sayName()); // bob
console.log(person1.sayName === person2.sayName); // true

我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法。如果按照字面意思來(lái)理解,那么prototype就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。使用原型對(duì)象的好處是可以讓所有對(duì)象實(shí)例共享它所包含的屬性和方法。

六、組合使用構(gòu)造函數(shù)模式和原型模式
function Person(name, age, obj) {
    this.name = name;
    this.age = age;
    this.obj = obj;
}

Person.prototype = {
    constructor: Person,
    sayName: function () {
        console.log(this.name);
    }
}

var person1 = new Person("bob", 22, "frontend");
var person2 = new Person("lynn", 22, "doctor");

console.log(person1.name); // bob
console.log(person2.name); // lynn
console.log(person1.sayName === person2.sayName); // true
七、動(dòng)態(tài)原型模式
function Person(name, age, obj) {
    this.name = name;
    this.age = age;
    this.obj = obj;

    console.log("typeof this.sayName: ", typeof this.sayName);
    // 檢測(cè)sayName 是不是一個(gè)函數(shù)
    // 實(shí)際上只在當(dāng)前第一次時(shí)候沒(méi)有創(chuàng)建的時(shí)候在原型上添加sayName方法
    if (typeof this.sayName != "function") {
        Person.prototype.sayName = function () {
            return this.name;
        }
    }
}

var person1 = new Person("bob", 22, "frontend");
var person2 = new Person("lynn", 22, "doctor");

console.log(person1.name); // bob
console.log(person2.name); // lynn
console.log(person1.sayName()); // bob
console.log(person2.sayName()); // lynn
console.log(person1.sayName === person2.sayName); // true
八、寄生構(gòu)造函數(shù)模式
function createPerson(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 person1 = new createPerson("bob", 22, "frontend");
var person2 = new createPerson("lynn", 22, "doctor");

console.log(person1.name); // bob
console.log(person2.name); // lynn

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95937.html

相關(guān)文章

  • JavaScript常用八種繼承方案

    摘要:原型式繼承利用一個(gè)空對(duì)象作為中介,將某個(gè)對(duì)象直接賦值給空對(duì)象構(gòu)造函數(shù)的原型。其中表示構(gòu)造函數(shù),一個(gè)類中只能有一個(gè)構(gòu)造函數(shù),有多個(gè)會(huì)報(bào)出錯(cuò)誤如果沒(méi)有顯式指定構(gòu)造方法,則會(huì)添加默認(rèn)的方法,使用例子如下。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo))showImg(https://segmentfault.com/img/rem...

    wpw 評(píng)論0 收藏0
  • Vue組件之間通信的八種方式

    摘要:使用也有很長(zhǎng)一段時(shí)間但是一直以來(lái)都沒(méi)對(duì)其組件之間的通信做一個(gè)總結(jié)這次就借此總結(jié)一下。引用信息將會(huì)注冊(cè)在父組件的對(duì)象上。 使用Vue也有很長(zhǎng)一段時(shí)間,但是一直以來(lái)都沒(méi)對(duì)其組件之間的通信做一個(gè)總結(jié),這次就借此總結(jié)一下。 父子組件之間的通信 1)props和$emit 父組件通過(guò)props將數(shù)據(jù)下發(fā)給props,子組件通過(guò)$emit來(lái)觸發(fā)自定義事件來(lái)通知父組件進(jìn)行相應(yīng)的操作 具體代碼如下: ...

    klinson 評(píng)論0 收藏0
  • 八種js交換兩個(gè)變量的值方案總結(jié)

    摘要:假定期望交換和的值序號(hào)實(shí)現(xiàn)方案中間變量備注按位操作符只適用類型只適用類型有腦洞先執(zhí)行對(duì)象解構(gòu)賦值推薦數(shù)組解構(gòu)賦值簡(jiǎn)書(shū)首發(fā)轉(zhuǎn)載請(qǐng)注明來(lái)自簡(jiǎn)書(shū) 假定let a = 1,b=10;期望交換a和b的值 序號(hào) 實(shí)現(xiàn)方案 中間變量? 備注 1 let c; c = a; a = b; b = c; ? 2 a ^= b; b ^=a; a ^=b MDN-按位操作符, 只適...

    LiveVideoStack 評(píng)論0 收藏0
  • Java 總結(jié)

    摘要:中的詳解必修個(gè)多線程問(wèn)題總結(jié)個(gè)多線程問(wèn)題總結(jié)有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開(kāi)源的運(yùn)行原理從虛擬機(jī)工作流程看運(yùn)行原理。 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 自己實(shí)現(xiàn)集合框架 (三): 單鏈表的實(shí)現(xiàn) 基于 POI 封裝 ExcelUtil 精簡(jiǎn)的 Excel 導(dǎo)入導(dǎo)出 由于 poi 本身只是針對(duì)于 ...

    caspar 評(píng)論0 收藏0
  • OpenCV實(shí)戰(zhàn) | 八種目標(biāo)跟蹤算法

    摘要:目標(biāo)追蹤首先,我們會(huì)大致介紹八種建立在上的目標(biāo)跟蹤算法。詞典包含了種的目標(biāo)追蹤器行。它將目標(biāo)追蹤器的命令行參數(shù)字符串映射到實(shí)際的追蹤器函數(shù)上。其中行里的目的是根據(jù)追蹤器命令行參數(shù)以及從得來(lái)的相關(guān)重要信息。 雖然我們熟知的的質(zhì)心追蹤器表現(xiàn)得很好,但它需要我們?cè)谳斎氲囊曨l上的每一幀運(yùn)行一個(gè)目標(biāo)探測(cè)器。對(duì)大多數(shù)環(huán)境來(lái)說(shuō),在每幀上進(jìn)行檢測(cè)非常耗費(fèi)計(jì)算力。所以,我們想應(yīng)用一種一次性的目標(biāo)檢測(cè)方法,然后...

    shevy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<