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

資訊專欄INFORMATION COLUMN

JavaScript面向?qū)ο缶?一)

hiYoHoo / 1630人閱讀

摘要:使函數(shù)不同于其他對(duì)象的決定性特性是函數(shù)存在一個(gè)被稱為的內(nèi)部屬性。其中,是一個(gè)布爾值,指明改對(duì)象本身是否可以被修改值為。注意凍結(jié)對(duì)象和封印對(duì)象均要在嚴(yán)格模式下使用。

數(shù)據(jù)類型

在JavaScript中,數(shù)據(jù)類型分為兩類:

原始類型:保存一些簡(jiǎn)單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型:

boolean:布爾,值為truefalse

number:數(shù)字,值為任何整型會(huì)浮點(diǎn)數(shù)值

string:字符串,值為由單引號(hào)或雙引號(hào)括出的單個(gè)字符或連續(xù)字符(JavaScript不區(qū)分字符類型)

null:空類型,其僅有一個(gè)值:nulll

undefined:未定義,其僅有一個(gè)值:undefined

var name = "Pomy";
var blog = "http://www.ido321.com";
var age = 22;
alert(typeof blog); //"string"
alert(typeof age); //"number"

原始類型的值是直接保存在變量中,并可以用typeof進(jìn)行檢測(cè)。但是typeof對(duì)null的檢測(cè)是返回object,而不是返回null

//彈出Not null
if(typeof null){
    alert("Not null");   
}else{
    alert("null");
}

所以檢測(cè)null時(shí),最好用全等于(===),其還能避免強(qiáng)制類型轉(zhuǎn)換:

console.log("21" === 21);  //false
console.log("21" == 21);  //true
console.log(undefined == null);  //true
console.log(undefined === null);  //false

對(duì)于字符串、數(shù)字或者布爾值,其都有對(duì)應(yīng)的方法,這些方法來(lái)自于對(duì)應(yīng)的原始封裝類型:String、NumberBoolean。原始封裝類型將被自動(dòng)創(chuàng)建。

var name = "Pomy";
var char = name.charAt(0);
console.log(char);  //"P"

在JavaScript引擎中發(fā)生的事情:

var name = "Pomy";
var temp = new String(name);
var char = temp.charAt(0);
temp = null;
console.log(char);  //"P"

字符串對(duì)象的引用在用完之后立即被銷毀,所以不能給字符串添加屬性,并且instanceof檢測(cè)對(duì)應(yīng)類型時(shí)均返回false

var name = "Pomy";
name.age = 21;
console.log(name.age);   //undefined
console.log(name instanceof String);  //false

引用類型:保存為對(duì)象,實(shí)質(zhì)是指向內(nèi)存位置的引用,所以不在變量中保存對(duì)象。除了自定義的對(duì)象,JavaScript提供了6中內(nèi)建類型:

Array:數(shù)組類型,以數(shù)字為索引的一組值的有序列表

Date:日期和時(shí)間類型

Error:運(yùn)行期錯(cuò)誤類型

Function:函數(shù)類型

Object:通用對(duì)象類型

RegExp:正則表達(dá)式類型
可以用new來(lái)實(shí)例化每一個(gè)對(duì)象,或者用字面量形式來(lái)創(chuàng)建對(duì)象:

var obj = new Object;
var own = {
            name:"Pomy",
            blog:"http://www.ido321.com",
            "my age":22
        };
console.log(own.blog);    //訪問(wèn)屬性
console.log(own["my age"]); 
obj = null;  //解除引用

obj 并不包含對(duì)象實(shí)例,而是一個(gè)指向內(nèi)存中實(shí)際對(duì)象所在位置的指針(或者說(shuō)引用)。因?yàn)?b>typeof對(duì)所有非函數(shù)的引用類型均返回object,所以需要用instanceof來(lái)檢測(cè)引用類型。

函數(shù)

在JavaScript中,函數(shù)就是對(duì)象。使函數(shù)不同于其他對(duì)象的決定性特性是函數(shù)存在一個(gè)被稱為[[Call]]的內(nèi)部屬性。內(nèi)部屬性無(wú)法通過(guò)代碼訪問(wèn)而是定義了代碼執(zhí)行時(shí)的行為。

創(chuàng)建形式

1、函數(shù)聲明:用function關(guān)鍵字,會(huì)被提升至上下文
2、函數(shù)表達(dá)式:不能被提升
3、實(shí)例化Function內(nèi)建類型

sayHi();    //函數(shù)提升
function sayHi(){
    console.log("Hello");
}
//其他等效等效方式
/*
var sayHi = function(){
     console.log("Hello");
}
var sayHi = new Function(" console.log("Hello");");
*/
參數(shù)

JavaScript函數(shù)的另外一個(gè)獨(dú)特之處在于可以給函數(shù)傳遞任意數(shù)量的參數(shù)。函數(shù)參數(shù)被保存在arguments類數(shù)組對(duì)象中,其自動(dòng)存在函數(shù)中,能通過(guò)數(shù)字索引來(lái)引用參數(shù),但它不是數(shù)組實(shí)例:

alert(Array.isArray(arguments));   //false

類數(shù)組對(duì)象arguments 保存的是函數(shù)的實(shí)參,但并不會(huì)忽略形參。因而,arguments.length返回實(shí)參列表的長(zhǎng)度,arguments.callee.length返回形參列表的長(zhǎng)度。

function ref(value){
    return value;
}
console.log(ref("Hi"));
console.log(ref("Hi",22));
console.log(ref.length);  //1
函數(shù)中的this

關(guān)于this的問(wèn)題,可參考此文:JavaScript中的this。
JavaScript提供了三個(gè)方法用于改變this的指向:call、applybind。三個(gè)函數(shù)的第一個(gè)參數(shù)都是指定this的值,其他參數(shù)均作為參數(shù)傳遞給函數(shù)。

對(duì)象

對(duì)象是一種引用類型,創(chuàng)建對(duì)象常見的兩種方式:Object構(gòu)造函數(shù)和對(duì)象字面量形式:

var per1 = {
    name:"Pomy",
    blog:"http://www.ido321.com"
};
var per2 = new Object;
per2.name = "不寫代碼的碼農(nóng)";
屬性操作

在JavaScript中,可以隨時(shí)為對(duì)象添加屬性:

per1.age = 0;
per1.sayName = function(){
    alert(this.name);   //"Pomy"
}

因而,在檢測(cè)對(duì)象屬性是否存在時(shí),常犯的一個(gè)錯(cuò)誤是:

//結(jié)果是false
if(per1.age){
    alert(true)
}else{
    alert(false);
}

per1.age 是存在的,但是其值是0,所以不能滿足if條件。if判斷中的值是一個(gè)對(duì)象、非空字符串、非零數(shù)字或true時(shí),判斷會(huì)評(píng)估為真;而當(dāng)值是一個(gè)null、undefined0、false、NaN或空字符串時(shí)評(píng)估為假。
因而,檢測(cè)屬性是否存在時(shí),有另外的兩種方式:inhasOwnProperty(),前者會(huì)檢測(cè)原型屬性和自有(實(shí)例)屬性,后者只檢測(cè)自有(實(shí)例)屬性。

console.log("age" in per1);  //true
console.log(per1.hasOwnProperty("age"));  //true
console.log("toString" in per1);  //true
console.log(per1.hasOwnProperty("toString"));  //false

對(duì)象per1并沒(méi)有定義toString,該屬性繼承于Object.prototype,所以inhasOwnProperty()檢測(cè)該屬性時(shí)出現(xiàn)差異。如果只想判斷一個(gè)對(duì)象屬性是不是原型,可以利用如下方法:

function isPrototypeProperty(obj,name){
    return name in obj && !obj.hasOwnProperty(name);
}

若要?jiǎng)h除一個(gè)屬性,用delete操作符,用于刪除自有屬性,不能刪除原型屬性。

per1.toString = function(){
    console.log("per1對(duì)象");
};
console.log(per1.hasOwnProperty("toString"));   //true
per1.toString();   //"per1對(duì)象"
delete per1.toString;
console.log(per1.hasOwnProperty("toString"));   //false
console.log(per1.toString());  //[object Object]

有時(shí)需要枚舉對(duì)象的可枚舉屬性,也有兩種方式:for-in循環(huán)和Object.keys(),前者依舊會(huì)遍歷出原型屬性,后者只返回自有屬性。所有可枚舉屬性的內(nèi)部屬性[[Enumerable]]的值均為true

var per3 = {
    name:"Pomy",
    blog:"http://www.ido321.com",
    age:22,
    getAge:function(){
        return this.age;
    }
};

實(shí)際上,大部分原生屬性的[[Enumerable]]的值均為false,即該屬性不能枚舉??梢酝ㄟ^(guò)propertyIsEnumerable()檢測(cè)屬性是否可以枚舉:

console.log(per3.propertyIsEnumerable("name"));  //true
var pros = Object.keys(per3);  //返回可枚舉屬性的名字?jǐn)?shù)組
console.log("length" in pros);  //true
console.log(pros.propertyIsEnumerable("length"));  //false

屬性name是自定義的,可枚舉;屬性lengthArray.prototype的內(nèi)建屬性,不可枚舉。

屬性類型

屬性有兩種類型:數(shù)據(jù)屬性和訪問(wèn)器屬性。二者均具有四個(gè)屬性特征:

數(shù)據(jù)屬性:[[Enumerable]]、[[Configurable]]、[[Value]][[Writable]]

訪問(wèn)器屬性:[[Enumerable]]、[[Configurable]][[Get]][[Set]]

[[Enumerable]] :布爾值,屬性是否可枚舉,自定義屬性默認(rèn)是true。
[[Configurable]] :布爾值,屬性是否可配置(可修改或可刪除),自定義屬性默認(rèn)是true。它是不可逆的,即設(shè)置成false后,再設(shè)置成true會(huì)報(bào)錯(cuò)。
[[Value]]:保存屬性的值。
[[Writable]]:布爾值,屬性是否可寫,所有屬性默認(rèn)可寫。
[[Get]]:獲取屬性值。
[[Set]]:設(shè)置屬性值。
ES 5提供了兩個(gè)方法用于設(shè)置這些內(nèi)部屬性:
Object.defineProperty(obj,pro,desc_map)Object.defineProperties(obj,pro_map)。利用這兩個(gè)方法為per3添加一個(gè)屬性和創(chuàng)建一個(gè)新對(duì)象per4:

Object.defineProperty(per3,"sex",{
    value:"male",
    enumerable:false,
    configurable:false, //屬性不能刪除和修改,該值也不能被設(shè)置成true
});
console.log(per3.sex);  //"male"
console.log(per3.propertyIsEnumerable("sex"));  //false
delete per3.sex;    //不能刪除
per3.sex = "female"; //不能修改
console.log(per3.sex);  //"male"
Object.defineProperty(per3,"sex",{
    configurable:true, //報(bào)錯(cuò)
});


per4 = {};
Object.defineProperties(per4,{
    name:{
        value:"dwqs",
        writable:true
    },
    blog:{
        value:"http://blog.92fenxiang.com"
    },
    Name:{
        get:function(){
            return this.name;
        },
        set:function(value){
            this.name = value;
        },
        enumerable:true,
        configurable:true
    }
});
console.log(per4.name); //dwqs
per4.Name = "Pomy";
console.log(per4.Name); //Pomy

需要注意的是,通過(guò)這兩種方式來(lái)定義新屬性時(shí),如果不指定特征值,則默認(rèn)是false,也不能創(chuàng)建同時(shí)具有數(shù)據(jù)特征和訪問(wèn)器特征的屬性??梢酝ㄟ^(guò)Object.getOwnPropertyDescriptor()方法來(lái)獲取屬性特征的描述,接受兩個(gè)參數(shù):對(duì)象和屬性名。若屬性存在,則返回屬性描述對(duì)象。

var desc = Object.getOwnPropertyDescriptor(per4,"name");
console.log(desc.enumerable); //false
console.log(desc.configurable); //false
console.log(desc.writable); //true

根據(jù)屬性的屬性類型,返回的屬性描述對(duì)象包含其對(duì)應(yīng)的四個(gè)屬性特征。

禁止修改對(duì)象

對(duì)象和屬性一樣具有指導(dǎo)其行為的內(nèi)部特征。其中,[[Extensible]]是一個(gè)布爾值,指明改對(duì)象本身是否可以被修改([[Extensible]]值為true)。創(chuàng)建的對(duì)象默認(rèn)都是可以擴(kuò)展的,可以隨時(shí)添加新的屬性。
ES5提供了三種方式:

Object.preventExtensions(obj):創(chuàng)建不可擴(kuò)展的obj對(duì)象,可以利用Object.isExtensible(obj)來(lái)檢測(cè)obj是否可以擴(kuò)展。嚴(yán)格模式下給不擴(kuò)展對(duì)象添加屬性會(huì)報(bào)錯(cuò),非嚴(yán)格模式下則添加失敗。

Object.seal(obj):封印對(duì)象,此時(shí)obj的屬性變成只讀,不能添加、改變或刪除屬性(所有屬性都不可配置),其[[Extensible]]值為false,[[Configurable]]值為false??梢岳?b>Object.isSealed(obj)來(lái)檢測(cè)obj是否被封印。

Object.freeze(obj):凍結(jié)對(duì)象,不能在凍結(jié)對(duì)象上添加或刪除屬性,不能改變屬性類型,也不能寫入任何數(shù)據(jù)類型。可以利用Object.isFrozen(obj)來(lái)檢測(cè)obj是否被凍結(jié)。

注意:凍結(jié)對(duì)象和封印對(duì)象均要在嚴(yán)格模式下使用。

"use strict";
var per5 = {
    name:"Pomy"
};
console.log(Object.isExtensible(per5));   //true
console.log(Object.isSealed(per5));         //false
console.log(Object.isFrozen(per5));       //false

Object.freeze(per5);
console.log(Object.isExtensible(per5));   //false
console.log(Object.isSealed(per5));       //true
console.log(Object.isFrozen(per5));       //true

per5.name="dwqs";
console.log(per5.name);   //"Pomy"
per5.Hi = function(){
    console.log("Hi");
};
console.log("Hi" in per5);  //false

delete per5.name;
console.log(per5.name);  //"Pomy"

var desc = Object.getOwnPropertyDescriptor(per5,"name");
console.log(desc.configurable);  //false
console.log(desc.writable);  //false

注意,禁止修改對(duì)象的三個(gè)方法只對(duì)對(duì)象的自有屬性有效,對(duì)原型對(duì)象的屬性無(wú)效,仍然可以在原型上添加或修改屬性

function Person(name){
    this.name = name;
}
var person1 = new Person("Pomy");
var person2 = new Person("dwqs");
Object.freeze(person1);
Person.prototype.Hi = function(){
    console.log("Hi");
};
person1.Hi();  //"Hi";
person2.Hi();  //"Hi";

原文:http://www.ido321.com/1585.html

相關(guān)文章:
DOM筆記(九):引用類型、基本包裝類型和單體內(nèi)置對(duì)象
DOM筆記(十一):JavaScript對(duì)象的基本認(rèn)識(shí)和創(chuàng)建

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

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

相關(guān)文章

  • JavaScript面向對(duì)象精要(二)

    摘要:使用時(shí),會(huì)自動(dòng)創(chuàng)建對(duì)象,其類型為構(gòu)造函數(shù)類型,指向?qū)ο髮?shí)例缺少關(guān)鍵字,指向全局對(duì)象。構(gòu)造函數(shù)本身也具有屬性指向原型對(duì)象。 在JavaScript面向?qū)ο缶?一)中講解了一些與面向?qū)ο笙嚓P(guān)的概念和方法,這篇講講原型和繼承。 構(gòu)造函數(shù)和原型對(duì)象 構(gòu)造函數(shù)也是函數(shù),用new創(chuàng)建對(duì)象時(shí)調(diào)用的函數(shù),與普通函數(shù)的一個(gè)區(qū)別是,其首字母應(yīng)該大寫。但如果將構(gòu)造函數(shù)當(dāng)作普通函數(shù)調(diào)用(缺少new關(guān)鍵字...

    wayneli 評(píng)論0 收藏0
  • Javascript面向對(duì)象精要讀書筆記

    摘要:面向?qū)ο缶x書筆記下面代碼的實(shí)際執(zhí)行過(guò)程是什么使用原始值和原始封裝類型是有區(qū)別的因?yàn)槭潜唤馕龀梢粋€(gè)對(duì)象的,所以肯定是真的函數(shù)是對(duì)象,函數(shù)有兩種字面形式,第一種是函數(shù)聲明,以關(guān)鍵字開頭后面跟函數(shù)名字。 Javascript面向?qū)ο缶x書筆記 1、下面代碼的實(shí)際執(zhí)行過(guò)程是什么? var name = fan var str = name.charAt(0) console.l...

    roadtogeek 評(píng)論0 收藏0
  • JavaScript面向對(duì)象精要》讀書筆記

    摘要:解除引用的最佳手段是將對(duì)象變量設(shè)置為。字面形式允許你在不需要使用操作符和構(gòu)造函數(shù)顯示創(chuàng)建對(duì)象的情況下生成引用值。函數(shù)就是值可以像使用對(duì)象一樣使用函數(shù)因?yàn)楹瘮?shù)本來(lái)就是對(duì)象,構(gòu)造函數(shù)更加容易說(shuō)明。 JavaScript(ES5)的面向?qū)ο缶?標(biāo)簽: JavaScript 面向?qū)ο?讀書筆記 2016年1月16日-17日兩天看完了《JavaScript面向?qū)ο缶罚▍⒓赢惒缴鐓^(qū)的活動(dòng)送...

    GitCafe 評(píng)論0 收藏0
  • BREW精要之COM 模型

    摘要:與使用作為接口的唯一標(biāo)識(shí)類似,使用稱之為的一個(gè)字節(jié)無(wú)符號(hào)整數(shù)作為唯一標(biāo)識(shí)。接口是客戶程序和組件程序之間的橋梁,接口應(yīng)該具有不變性,并且一個(gè)對(duì)象也應(yīng)該支持多個(gè)接口。 COM是Component Object Model (組件對(duì)象模型)的縮寫。BREW基本上遵從COM這一組件構(gòu)架的。組...

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

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

0條評(píng)論

閱讀需要支付1元查看
<