亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

《javascript高級程序設(shè)計(jì)》筆記:創(chuàng)建對象

姘存按 / 1926人閱讀

摘要:簡單方式創(chuàng)建對象字面量方式創(chuàng)建對象方式創(chuàng)建對象雖然構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個(gè)對象,但這些方式有個(gè)明顯的缺點(diǎn)使用同一個(gè)接口創(chuàng)建很多對象,會(huì)產(chǎn)生大量的重復(fù)代碼,如上面的代碼,每創(chuàng)建一個(gè)類似的對象,就會(huì)重復(fù)上面的寫法,代碼較為冗余為了

1. 簡單方式創(chuàng)建對象
  // 字面量方式創(chuàng)建對象
  var person1 = {
    name: "xyc",
    age: 23,
    sayHi: function() {
      console.log(name);
    }
  };
  
  // Object方式創(chuàng)建對象
  var person2 = new Object();
  person2.name = "lxy";
  person2.age = 18;
  person2.sayHi = function() {
    console.log(person2.name);
  }

雖然Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建單個(gè)對象,但這些方式有個(gè)明顯的缺點(diǎn):使用同一個(gè)接口創(chuàng)建很多對象,會(huì)產(chǎn)生大量的重復(fù)代碼,如上面的代碼,每創(chuàng)建一個(gè)類似的person對象,就會(huì)重復(fù)上面的寫法,代碼較為冗余

為了解決這個(gè)問題(代碼重復(fù)),下面引入工廠模式 ==>

2. 工廠模式創(chuàng)建對象
  function createPerson(name, age, job){
    var o = new Object();
    o.name = name;
    o.age = age;
    o.job = job;
    o.sayName = function(){
      alert(this.name);
    };
    return o; 
  }
  var person1 = createPerson("Nicholas", 29, "Software Engineer");
  var person2 = createPerson("Greg", 27, "Doctor");

通俗的解釋:工廠模式就是利用了函數(shù)的封裝調(diào)用,類比工廠材料==>成品的過程,完成入口參數(shù)==>對象的過程,函數(shù)可以無數(shù)次的生成,因此能夠避免上面產(chǎn)生大量重復(fù)代碼的情況。工廠模式雖然解決了創(chuàng)建多個(gè)相似對象的問題,但卻沒有解決對象識(shí)別的問題(即怎樣知道一個(gè)對象的類型)

為解決這個(gè)問題(對象識(shí)別),下面引入構(gòu)造函數(shù)模式

3. 構(gòu)造函數(shù)創(chuàng)建對象 3.1 構(gòu)造函數(shù)與普通函數(shù)的區(qū)別

命名規(guī)則:構(gòu)造函數(shù)一般是首字母大寫,普通函數(shù)遵照小駝峰式命名法

函數(shù)調(diào)用
構(gòu)造函數(shù):
(1)new fn( )
(2)構(gòu)造函數(shù)內(nèi)部會(huì)創(chuàng)建一個(gè)新的對象,即f的實(shí)例
(3)函數(shù)內(nèi)部的this指向 新創(chuàng)建的f的實(shí)例
(4)默認(rèn)的返回值是f的實(shí)例
普通函數(shù):
(1)fn( )
(2)在調(diào)用函數(shù)的內(nèi)部不會(huì)創(chuàng)建新的對象
(3)函數(shù)內(nèi)部的this指向調(diào)用函數(shù)的對象(如果沒有對象調(diào)用,默認(rèn)是window)
(4)返回值由return語句決定

構(gòu)造函數(shù)的返回值
有一個(gè)默認(rèn)的返回值,新創(chuàng)建的對象(實(shí)例),當(dāng)手動(dòng)添加返回值后(return語句):
(1)返回值是基本數(shù)據(jù)類型-->真正的返回值還是那個(gè)新創(chuàng)建的對象(實(shí)例)
(2)返回值是復(fù)雜數(shù)據(jù)類型(對象)-->真正的返回值是這個(gè)對象

function foo() {
  var f2 = new foo2();
  console.log(f2);    // {a: 3}
  console.log(this);  // window
  return true;
}
function foo2() {
  console.log(this);  // foo2類型的對象 不是foo2函數(shù)
  return {a: 3};
}
var f1 = foo();
console.log(f1);      // true

3.2 new 操作符作用

使用new操作符調(diào)用構(gòu)造函數(shù)會(huì)經(jīng)歷下面幾個(gè)步驟:
(1)創(chuàng)建一個(gè)以這個(gè)函數(shù)為原型的空對象.
(2)將函數(shù)的 prototype 賦值給對象的 proto 屬性
(3)將對象作為函數(shù)的 this 傳進(jìn)去。如果有 return 出來東西是對象的話就直接返回 return 的內(nèi)容,沒有的話就返回創(chuàng)建的這個(gè)對象

function NewFunc(func){
  var ret = {};
  if (func.prototype !== null) {
    ret.__proto__ = func.prototype;
  }
  var ret1 = func.apply(ret, Array.prototype.slice.call(arguments, 1));
  if ((typeof ret1 === "object" || typeof ret1 === "function") && ret1 !== null) {
    return ret1;
  }
  return ret;
}

普通函數(shù)的作用主要是封裝作用,能夠在作用域內(nèi)多處調(diào)用而已

3.3 構(gòu)造函數(shù)解決對象識(shí)別

創(chuàng)建自定義的構(gòu)造函數(shù)意味著可以通過 instanceof 將它的實(shí)例標(biāo)識(shí)為一種特定的類型

  function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.sayHi = function(){
      console.log(this.name);
    }
  }
  
  var person1 = new Person("xyc", 23);
  var person2 = new Person("lxy", 22);
  
  console.log(person1 instanceof Person); //true
  console.log(person2 instanceof Person); //true
  console.log(person1 instanceof Object); //true 因?yàn)镻erson繼承自O(shè)bject,所以這里一樣成立.
3.4 缺陷

構(gòu)造函數(shù)創(chuàng)建對象的方式解決了代碼重復(fù)對象識(shí)別的問題,但是創(chuàng)建的對象中含有方法時(shí),每實(shí)例化一個(gè)Person,就會(huì)產(chǎn)生一個(gè)方法,也就是一個(gè)對象,每個(gè)對象分別占據(jù)內(nèi)存。因此,構(gòu)造函數(shù)創(chuàng)建對象的方式存在內(nèi)存大量占用的風(fēng)險(xiǎn)

利用原型共享的特性,下面引入原型模式

4. 原型創(chuàng)建對象
  function Person(){}
  Person.prototype = {
    constructor: Person,
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",
    friends : ["Shelby", "Court"],
    sayName : function () {
      alert(this.name);
    } 
  };
  
  var person1 = new Person();
  var person2 = new Person();
  
  person1.sayName();    //"Nicholas"
  person2.sayName();    //"Nicholas"
  
  person1.friends.push("Van");
  alert(person1.friends);    //"Shelby,Court,Van"
  alert(person2.friends);    //"Shelby,Court,Van"
  alert(person1.friends === person2.friends);  //true

原型創(chuàng)建對象的方式將屬性和方法都存在與原型中,也就是說,只要通過這種形式創(chuàng)建的對象都會(huì)共享這些屬性和對象,相對于方法共享這是我們樂于看到的,但是屬性共享讓每個(gè)實(shí)例缺失了“個(gè)性”;另外對于引用類型的屬性共享時(shí),如上面的例子,多個(gè)實(shí)例對引用類型的操作會(huì)被篡改

實(shí)例一般都要有屬于自己的全部屬性,這也決定了原型創(chuàng)建方式的局限性。下面引入非常經(jīng)典的對象創(chuàng)建方式

5. 構(gòu)造函數(shù)+原型創(chuàng)建對象(重點(diǎn))

組合構(gòu)造函數(shù)模式與原型模式:構(gòu)造函數(shù)模式用于定義實(shí)力屬性,而原型模式用于定義方法和共享的屬性

  function Person(name, age, job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ["Shelby", "Court"];
  }
  
  Person.prototype = {
    constructor : Person,
    sayName : function(){
      alert(this.name);
    }
  }
  
  var person1 = new Person("Nicholas", 29, "Software Engineer");
  var person2 = new Person("Greg", 27, "Doctor");
  
  person1.friends.push("Van");
  alert(person1.friends);    //"Shelby,Count,Van"
  alert(person2.friends);    //"Shelby,Count"
  alert(person1.friends === person2.friends); //false
  alert(person1.sayName === person2.sayName); //true

這種方式創(chuàng)建的實(shí)例對象,每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性的副本,但同時(shí)又共享著對方法的引用,最大限度地節(jié)省了內(nèi)存;另外,這種方式還支持相構(gòu)造函數(shù)傳遞參數(shù),解決了上面的各種問題

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/89476.html

相關(guān)文章

  • javascript高級程序設(shè)計(jì)筆記:內(nèi)存與執(zhí)行環(huán)境

    摘要:因此,所有在方法中定義的變量都是放在棧內(nèi)存中的當(dāng)我們在程序中創(chuàng)建一個(gè)對象時(shí),這個(gè)對象將被保存到運(yùn)行時(shí)數(shù)據(jù)區(qū)中,以便反復(fù)利用因?yàn)閷ο蟮膭?chuàng)建成本通常較大,這個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)就是堆內(nèi)存。 上一篇:《javascript高級程序設(shè)計(jì)》筆記:繼承近幾篇博客都會(huì)圍繞著圖中的知識(shí)點(diǎn)展開 showImg(https://segmentfault.com/img/bVY0C4?w=1330&h=618);...

    fuyi501 評論0 收藏0
  • 《你不知道的javascript筆記_對象&原型

    摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...

    seasonley 評論0 收藏0
  • javascript高級程序設(shè)計(jì)筆記:繼承

    摘要:繼承和前面兩篇文章中的知識(shí)非常相關(guān),如果對函數(shù)創(chuàng)建原理和原型鏈不熟悉,請猛戳高級程序設(shè)計(jì)筆記創(chuàng)建對象高級程序設(shè)計(jì)筆記原型圖解繼承,通俗的說,就是將自身不存在的屬性或方法,通過某種方式為自己所用文章分別介紹原型鏈繼承繼承借用構(gòu)造函數(shù)繼承組合繼 繼承和前面兩篇文章中的知識(shí)非常相關(guān),如果對函數(shù)創(chuàng)建原理和原型鏈不熟悉,請猛戳:《javascript高級程序設(shè)計(jì)》筆記:創(chuàng)建對象《javascri...

    JerryC 評論0 收藏0
  • JavaScript高級程序設(shè)計(jì)-摘要筆記-3

    摘要:如果重設(shè)構(gòu)造函數(shù)的原型對象,那么,會(huì)切斷新的原型對象和任何之前已經(jīng)存在的構(gòu)造函數(shù)實(shí)例之間的聯(lián)系,它們引用的仍然是最初的原型。說明返回的對象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性沒有關(guān)系。 說明: 此摘要筆記系列是我最近看《JavaScript高級程序設(shè)計(jì)(第3版)》隨手所記。里面分條列舉了一些我認(rèn)為重要的、需要記下的、對我有幫助的點(diǎn),是按照我看的順序來的。摘要筆記本身沒有系統(tǒng)性,沒有全面性...

    AndroidTraveler 評論0 收藏0
  • 筆記JavaScript高級篇——面向對象、原型、繼承

    摘要:繼承傳統(tǒng)的面向?qū)ο笳Z言,繼承是類與類之間的關(guān)系。原型繼承原型定義原型就是指構(gòu)造函數(shù)的屬性所引用的對象。創(chuàng)建構(gòu)造函數(shù)創(chuàng)建的實(shí)例對象張三李四就是對象的原型也是的原型在原型上創(chuàng)建一個(gè)屬性運(yùn)行和,并對比是否為同一個(gè)方法。 原文鏈接:http://www.hansmkiii.com/2018/07/06/javascript-node-1/ 面向?qū)ο?、原型、繼承 1、面向?qū)ο?1.1 什么...

    OBKoro1 評論0 收藏0
  • javascript高級程序設(shè)計(jì)筆記:變量對象與預(yù)解析

    摘要:檢查當(dāng)前上下文中的參數(shù),建立該對象下的屬性與屬性值。檢查當(dāng)前上下文的函數(shù)聲明,也就是使用關(guān)鍵字聲明的函數(shù)。如果該變量名的屬性已經(jīng)存在,為了防止同名的函數(shù)被修改為,則會(huì)直接跳過,原屬性值不會(huì)被修改。 上一篇:《javascript高級程序設(shè)計(jì)》筆記:內(nèi)存與執(zhí)行環(huán)境showImg(https://segmentfault.com/img/bVY4xr?w=1146&h=374); 上篇文章...

    tyheist 評論0 收藏0

發(fā)表評論

0條評論

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