国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

創(chuàng)建對(duì)象的4種方式

seanlook / 3254人閱讀

摘要:創(chuàng)建對(duì)象的種方式方式一通過對(duì)象字面量表示法又稱為直接量原始方式。例子在自定義構(gòu)造函數(shù)的內(nèi)部定義對(duì)象的方法函數(shù)的值賦給的屬性。

創(chuàng)建對(duì)象的4種方式

方式一:通過對(duì)象字面量表示法(又稱為直接量、原始方式)。object literals

方式二:通過new和構(gòu)造函數(shù)Object()、String()等。

方式三:用自定義構(gòu)造函數(shù)來初始化新對(duì)象。

方式四:通過Object.create()

方式一:通過對(duì)象字面量表示法(又稱為直接量、原始方式)object literals

var obj = {name:"zyx456"};

對(duì)象字面量是一個(gè)名/值對(duì)列表,每個(gè)名/值對(duì)之間用逗號(hào)分隔,名和值之間用冒號(hào)分隔,最后整體用一個(gè)花括號(hào)括起來。

屬性名可以使用數(shù)值,比如5。數(shù)值屬性名會(huì)自動(dòng)轉(zhuǎn)換為字符串。

var person = {"name" : "Nicholas","age" : 29,5 : true};

屬性名一般不加引號(hào),以下情況必須加引號(hào):

屬性名中有空格,

有連字符“-”

有關(guān)鍵字,比如“for”。

在ES5(以及ES3的一些實(shí)現(xiàn))中,保留字可以用做不帶引號(hào)的屬性名。然而對(duì)于ES3來說,使用保留字作為屬性名必須使用引號(hào)引起來。

例子:

var person = {
    name : "Nicholas",
    age : 29};

在ES5中,對(duì)象直接量中的最后一個(gè)屬性后的逗號(hào)可以省略,且在ES3的大部分實(shí)現(xiàn)中也可以忽略這個(gè)逗號(hào),但在IE中則報(bào)錯(cuò)。

使用對(duì)象字面量語法時(shí),如果留空其花括號(hào),則可以定義只包含默認(rèn)屬性和方法的空對(duì)象。

var obj = {};

對(duì)象字面量也可以先創(chuàng)建,再添加屬性和方法。

var person = {};         //與new Object()相同
person.name = "Nicholas";
person.age = 29;

在通過對(duì)象字面量定義對(duì)象時(shí),實(shí)際上不會(huì)調(diào)用Object構(gòu)造函數(shù)。

對(duì)象可以嵌套對(duì)象:

例如:

var myHome={
        population : "10,000" ,
        area : "10,000" ,
        adress : {  // 屬性
                country : "China" ,
                province : "shanxi" ,
                city : "xian"
            },
        say : function(){  // 方法
                return "My hometown is very beautiful ! ";
            }
    }

//構(gòu)造嵌套的對(duì)象
var SchoolData = {
    code: "0123-456-789",
    Tel: "0551-1234567",
    Fax: "0551-7654321"
};
//構(gòu)造被嵌入的對(duì)象
var ZGKJDX = {
    name: "中國科技大學(xué)",
    address: "安徽·合肥",
    grade: "高等學(xué)府",
    number: "13400",
    //嵌套對(duì)象SchoolData
    data: SchoolData,
};

有一個(gè)缺點(diǎn):如果我們想在其他地方創(chuàng)建一個(gè)同樣的對(duì)象,就得把這個(gè)對(duì)象的所有代碼都復(fù)制粘貼過去。我們需要一種能夠批量創(chuàng)建同樣對(duì)象的方法,而不是只創(chuàng)建一個(gè)對(duì)象。

有一個(gè)問題:即無法保證屬性的順序。

添加屬性的順序可能并不是遍歷輸出屬性時(shí)的順序。

例如

var o = {}
o.a = 1
o.b = 2
o.c = 3
for(key in o) console.log(key); // expected a,b,c - but not guaranteed to be in that order

Object 對(duì)象也缺乏forEach的方法,不能對(duì)object使用通常的迭代方法。

o.forEach // undefined
方式二:通過new和構(gòu)造函數(shù)Object()、String()等。

var obj = new Object();

這里的函數(shù)稱做構(gòu)造函數(shù)(constructor)。

如下所示:

var person = new Object();
person.name = "Nicholas";
person.age = 29

如果構(gòu)造函數(shù)無參數(shù),括號(hào)則不是必需的。

因此可以采用下面的形式重寫上面的兩行代碼:

var oObject = new Object;
var oStringObject = new String;
var str  = new String();
console.log(str); // 輸出的是 String{length:0,[[PrimitiveValue]]:""}
console.log(typeof str);//object;

結(jié)果:

JS原始類型都包含內(nèi)置構(gòu)造函數(shù)。例如:

var o = new Object();           // 創(chuàng)建一個(gè)空對(duì)象,和{}一樣
var a = new Array();            // 創(chuàng)建一個(gè)空數(shù)組,和[]一樣
var d = new Date();             // 創(chuàng)建一個(gè)表示當(dāng)前時(shí)間的Date對(duì)象
var r = new RegExp("js");       //創(chuàng)建一個(gè)可以進(jìn)行模式匹配的EegExp對(duì)象

在JS中,通過 new 運(yùn)算符來作用與一個(gè)函數(shù),實(shí)質(zhì)上會(huì)發(fā)生這樣的過程:

首先,創(chuàng)建一個(gè)空對(duì)象,然后用函數(shù)的apply方法,將這個(gè)空對(duì)象傳入作為 apply 的第一個(gè)參數(shù),作為上下文參數(shù)。也就是this的指向。

var triangle = new Shape("triangle");
    //上一句相當(dāng)于下面的代碼
var triangle = {};
Shape.apply(triangle, ["triangle"]);
方式三:用自定義構(gòu)造函數(shù)來初始化新對(duì)象。
function A(o){
this.name = "moyu"
}
let obj = new a();

例子:

function person(firstname,lastname,age,eyecolor){
    this.firstname=firstname;
    this.lastname=lastname;
    this.age=age;
    this.eyecolor=eyecolor;
}
var myFather=new person("Bill","Gates",56,"blue");
var myMother=new person("Steve","Jobs",48,"green");

在自定義構(gòu)造函數(shù)的內(nèi)部定義對(duì)象的方法:

function person(firstname,lastname,age,eyecolor)
{
    this.firstname=firstname;
    this.lastname=lastname;
    this.age=age;
    this.eyecolor=eyecolor;
 
    this.changeName=changeName;
    function changeName(name)
    {
        this.lastname=name;
    }
}

changeName() 函數(shù) name 的值賦給 person 的 lastname 屬性。

myMother.changeName("Ballmer");
方式四:通過Object.create()

Object.create()是一個(gè)靜態(tài)函數(shù),而不是提供給某個(gè)對(duì)象實(shí)例調(diào)用的方法。

var o1 = Object.create({x:1, y:2}); // o1繼承了屬性x和y

可以通過任意原型創(chuàng)建新對(duì)象(換句話說,可以繼承任意對(duì)象)。

第一個(gè)參數(shù)是這個(gè)新對(duì)象的原型。

第二個(gè)參數(shù)屬性描述符對(duì)象propertiesObject,用于對(duì)對(duì)象的屬性進(jìn)行進(jìn)一步描述??蛇x。

屬性描述符對(duì)象中的屬性,默認(rèn)不可枚舉,是繼承的屬性。

如果propertiesObject指定為 undefined,那么是空對(duì)象{}。

如果是null或非原始包裝對(duì)象,則拋出一個(gè) TypeError 異常。

o = Object.create(Object.prototype, {
    // foo會(huì)成為所創(chuàng)建對(duì)象的數(shù)據(jù)屬性
    foo: {
        writable:true,
        configurable:true,
        value: "hello"
    },
    // bar會(huì)成為所創(chuàng)建對(duì)象的訪問器屬性
    bar: {
        configurable: false,
        get: function() { return 10 },
        set: function(value) {
            console.log("Setting `o.bar` to", value);
        }
    }
});

返回一個(gè)新對(duì)象,帶著指定的原型對(duì)象和屬性。

例子:

var obj = Object.create({}, {p: {value: 42}});
Object.values(obj); // => []

上面代碼中,Object.create()方法的第二個(gè)參數(shù)添加的對(duì)象屬性(屬性p),如果不顯式聲明,默認(rèn)是不可遍歷的,因?yàn)閜是繼承的屬性,而不是對(duì)象自身的屬性。

可以通過傳入?yún)?shù)null來創(chuàng)建一個(gè)沒有原型的新對(duì)象,但通過這種方式創(chuàng)建的對(duì)象不會(huì)繼承任何東西,甚至不包括基礎(chǔ)方法,比如toString(),也就是說,它將不能和“+”運(yùn)算符一起正常工作:

var o2 = Object.create(null);      //o2不繼承任何屬性和方法

如果想創(chuàng)建一個(gè)普通的空對(duì)象(比如通過{}或new Object()創(chuàng)建的對(duì)象),需要傳入Object.prototype:

var o3 = Object.create(Object.prototype);  //o3和{}和new Object()一樣

例子:通過原型繼承創(chuàng)建一個(gè)新對(duì)象。

inherit() 返回了一個(gè)繼承自原型對(duì)象p的新對(duì)象。

這里使用ES5中的Object.create()函數(shù)(如果存在的話)。

如果不存在Object.create(),則退化使用其他方法。

function inherit(p) {
        if (p == null) throw TypeError();       // p是一個(gè)對(duì)象,但不能是null
        if (Object.create)   return Object.create(p);   // 如果Object.create()存在,直接使用它
        var t = typeof p;                       // 否則進(jìn)行進(jìn)一步檢測
        if (t !== "object" && t !== "function") throw TypeError();
        function f() {};                        // 定義一個(gè)空構(gòu)造函數(shù)
        f.prototype = p;                        //將其原型屬性設(shè)置為p
        return new f();                         //使用f()創(chuàng)建p的繼承對(duì)象
}
var o = {};    
o.x = 1;      
var p = inherit(o); // p繼承o和Object.prototype
p.y = 2;        
var q = inherit(p); 
q.z = 3;      
var s = q.toString(); 
q.x + q.y       // => 3: x和y分別繼承自o和p

注意,inherit()并不能完全代替Object.create(),它不能通過傳入null原型來創(chuàng)建對(duì)象,而且不能接收可選的第二個(gè)參數(shù)。

inherit()函數(shù)的其中一個(gè)用途就是防止庫函數(shù)無意間(非惡意地)修改那些不受你控制的對(duì)象。

不是將對(duì)象直接作為參數(shù)傳入函數(shù),而是將它的繼承對(duì)象傳入函數(shù)。

當(dāng)函數(shù)讀取繼承對(duì)象的屬性時(shí),實(shí)際上讀取的是繼承來的值。

如果給繼承對(duì)象的屬性賦值,則這些屬性只會(huì)影響這個(gè)繼承對(duì)象自身,而不是原始對(duì)象:

var o = { x: "don"t change this value" };
library_function(inherit(o));   // 防止對(duì)o的意外修改

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/106332.html

相關(guān)文章

  • 加載機(jī)制

    摘要:如果沒有,那必須先執(zhí)行相應(yīng)的類加載過程。分配內(nèi)存在類加載檢查通過后,接下來虛擬機(jī)將為新生對(duì)象分配內(nèi)存。程序計(jì)數(shù)器主要有兩個(gè)作用字節(jié)碼解釋器通過改變程序計(jì)數(shù)器來依次讀取指令,從而實(shí)現(xiàn)代碼的流程控制,如順序執(zhí)行選擇循環(huán)異常處理。 目錄介紹 01.Java對(duì)象的創(chuàng)建過程 1.0 看下創(chuàng)建類加載過程 1.1 對(duì)象的創(chuàng)建 1.2 對(duì)象的內(nèi)存布局 02.Java內(nèi)存區(qū)域 2.0 運(yùn)行...

    mikyou 評(píng)論0 收藏0
  • Spring筆記01_下載_概述_監(jiān)聽器

    摘要:簡單來說,是一個(gè)輕量級(jí)的控制反轉(zhuǎn)和面向切面的容器框架。變成的支持提供面向切面編程,可以方便的實(shí)現(xiàn)對(duì)程序進(jìn)行權(quán)限攔截,運(yùn)行監(jiān)控等功能。用于反射創(chuàng)建對(duì)象,默認(rèn)情況下調(diào)用無參構(gòu)造函數(shù)。指定對(duì)象的作用范圍。 1.Spring介紹 1.1 Spring概述 Spring是一個(gè)開源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的Java 開發(fā)框架,由Rod Johnson 在其著作Expert...

    reclay 評(píng)論0 收藏0
  • JavaScript 面向對(duì)象開發(fā)知識(shí)總結(jié)基礎(chǔ)篇

    摘要:字面形式允許你在不需要使用操作符和構(gòu)造函數(shù)顯式創(chuàng)建對(duì)象的情況下生成引用值。操作符以一個(gè)對(duì)象和一個(gè)構(gòu)造函數(shù)作為參數(shù)鑒別數(shù)組有前一小結(jié)可以知道鑒別數(shù)組類型可以使用。屬性是函數(shù)獨(dú)有的,表明該對(duì)象可以被執(zhí)行。這種函數(shù)被稱為匿名函數(shù)。 引子: 1.JavaScript 中的變量類型和類型檢測 1.1原始類型 1.2引用類型 1.3內(nèi)建類型的實(shí)例化 1.4函數(shù)的字面形式 1.5正則表達(dá)式的字...

    Kross 評(píng)論0 收藏0
  • Spring IOC 容器源碼分析 - 創(chuàng)建原始 bean 對(duì)象

    摘要:你也會(huì)了解到構(gòu)造對(duì)象的兩種策略。構(gòu)造方法參數(shù)數(shù)量低于配置的參數(shù)數(shù)量,則忽略當(dāng)前構(gòu)造方法,并重試。通過默認(rèn)構(gòu)造方法創(chuàng)建對(duì)象看完了上面冗長的邏輯,本節(jié)來看點(diǎn)輕松的吧通過默認(rèn)構(gòu)造方法創(chuàng)建對(duì)象。 1. 簡介 本篇文章是上一篇文章(創(chuàng)建單例 bean 的過程)的延續(xù)。在上一篇文章中,我們從戰(zhàn)略層面上領(lǐng)略了doCreateBean方法的全過程。本篇文章,我們就從戰(zhàn)術(shù)的層面上,詳細(xì)分析doCreat...

    sutaking 評(píng)論0 收藏0
  • Java進(jìn)階1 —— 對(duì)象創(chuàng)建與銷毀

    摘要:構(gòu)造方法是在對(duì)象實(shí)例初始化過程中具有舉足輕重的地位,并且提供了多種方式來定義構(gòu)造方法。在中創(chuàng)建對(duì)象的開銷是相當(dāng)?shù)偷?,并且速度很快。?duì)象終結(jié)器前面我們講述的都是構(gòu)造方法和對(duì)象初始化相關(guān)的主題,但還未提及他們的反面對(duì)象銷毀。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...

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

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

0條評(píng)論

seanlook

|高級(jí)講師

TA的文章

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