這次帶給大家JS物件導向的使用詳解,JS物件導向使用的注意事項有哪些,下面就是實戰案例,一起來看一下。
資料型別#
在JavaScript中,資料型別分為兩類:
原始型別
保存一些簡單數據,如true,5等。 JavaScript共有5中原始型別:
boolean:布爾,值為true或false
number:數字,值為任何整數會浮點數值
string:字串,值為由單引號或雙引號括出的單一字元或連續字元( JavaScript不區分字元型別)
null:空型,其只有一個值:nulll
undefined:未定義,只有一個值:undefined
var name = "Pomy"; var blog = "http://www.ido321.com"; var age = 22; alert(typeof blog); //"string" alert(typeof age); //"number"
原始類型的值是直接保存在變數中,並可以用 typeof 進行檢測。但是typeof對null的偵測是回傳object,而不是回傳null:
//弹出Not null if(typeof null){ alert("Not null"); }else{ alert("null"); }
所以偵測null時,最好用全等於(===),其還能避免強制型別轉換:
console.log("21" === 21); //false console.log("21" == 21); //true console.log(undefined == null); //true console.log(undefined === null); //false
對於字串、數字或布林值,其都有對應的方法,這些方法來自於對應的原始封裝類型:String、Number和Boolean。原始封裝類型將會自動建立。
var name = "Pomy"; var char = name.charAt(0); console.log(char); //"P"
在JavaScript引擎中發生的事情:
var name = "Pomy"; var temp = new String(name); var char = temp.charAt(0); temp = null; console.log(char); //"P"
字串物件的參考在用完之後立即被銷毀,所以不能給字串添加屬性,並且instanceof檢測對應類型時均傳回false:
var name = "Pomy"; name.age = 21; console.log(name.age); //undefined console.log(name instanceof String); //false
引用型別
儲存為對象,實質是指向記憶體位置的引用,所以不在變數中儲存物件。除了自訂的對象,JavaScript提供了6中內建類型:
Array:陣列類型,以數字為索引的一組值的有序列表
Date:日期和時間類型
Error:運行期間錯誤類型
Function:函數類型
Object:通用物件類型
RegExp:正規表示式類型
可以用new來實例化每個對象,或是用字面量形式來建立對象:
var obj = new Object; var own = { name:"Pomy", blog:"http://www.ido321.com", "my age":22 }; console.log(own.blog); //访问属性 console.log(own["my age"]); obj = null; //解除引用
# obj 並不包含物件實例,而是一個指向記憶體中實際物件所在位置的指標(或說引用)。因為typeof對所有非函數的參考型別均傳回object,所以需要用instanceof來偵測引用型別。
函數
在JavaScript中,函數就是物件。使函數不同於其他物件的決定性特性是函數存在一個被稱為[[Call]]的內部屬性。內部屬性無法透過程式碼存取而是定義了程式碼執行時的行為。
創建形式
1.函數宣告:用function關鍵字,會被提升至上下文
2、函數表達式:不能被提升
3、實例化Function內建類型
sayHi(); //函数提升 function sayHi(){ console.log("Hello"); } //其他等效等效方式 /* var sayHi = function(){ console.log("Hello"); } var sayHi = new Function(" console.log(\"Hello\");"); */
參數
JavaScript函數的另一個獨特之處在於可以傳遞給函數任意數量的參數。函數參數被保存在arguments類別數組物件中,其自動存在函數中,能透過數字索引來引用參數,但它不是數組實例:
#
alert(Array.isArray(arguments)); //false
類別陣列物件arguments 保存的是函數的實參,但並不會忽略形參。因而,arguments.length返回實參列表的長度,arguments.callee.length返回形參列表的長度。
function ref(value){ return value; } console.log(ref("Hi")); console.log(ref("Hi",22)); console.log(ref.length); //1
函數中的this
關於this的問題,可參考此文:JavaScript中的this。
JavaScript提供了三個方法用來改變this的指向:call、apply和bind。三個函數的第一個參數都是指定this的值,其他參數都作為參數傳遞給函數。
物件
物件是一種參考類型,建立物件常見的兩種方式:Object建構子和物件字面量形式:
var per1 = { name:"Pomy", blog:"http://www.ido321.com" }; var per2 = new Object; per2.name = "不写代码的码农";
屬性操作
在JavaScript中,可以隨時為物件新增屬性:
per1.age = 0; per1.sayName = function(){ alert(this.name); //"Pomy" }
因而,在检测对象属性是否存在时,常犯的一个错误是:
//结果是false if(per1.age){ alert(true) }else{ alert(false); }
per1.age 是存在的,但是其值是0,所以不能满足if条件。if判断中的值是一个对象、非空字符串、非零数字或true时,判断会评估为真;而当值是一个null、undefined、0、false、NaN或空字符串时评估为假。
因而,检测属性是否存在时,有另外的两种方式:in和hasOwnProperty(),前者会检测原型属性和自有(实例)属性,后者只检测自有(实例)属性。
console.log("age" in per1); //true console.log(per1.hasOwnProperty("age")); //true console.log("toString" in per1); //true console.log(per1.hasOwnProperty("toString")); //false
对象per1并没有定义toString,该属性继承于Object.prototype,所以in和hasOwnProperty()检测该属性时出现差异。如果只想判断一个对象属性是不是原型,可以利用如下方法:
function isPrototypeProperty(obj,name){ return name in obj && !obj.hasOwnProperty(name); }
若要删除一个属性,用delete操作符,用于删除自有属性,不能删除原型属性。
per1.toString = function(){ console.log("per1对象"); }; console.log(per1.hasOwnProperty("toString")); //true per1.toString(); //"per1对象" delete per1.toString; console.log(per1.hasOwnProperty("toString")); //false console.log(per1.toString()); //[object Object]
有时需要枚举对象的可枚举属性,也有两种方式:for-in循环和Object.keys(),前者依旧会遍历出原型属性,后者只返回自有属性。所有可枚举属性的内部属性[[Enumerable]]的值均为true。
var per3 = { name:"Pomy", blog:"http://www.ido321.com", age:22, getAge:function(){ return this.age; } };
实际上,大部分原生属性的[[Enumerable]]的值均为false,即该属性不能枚举。可以通过propertyIsEnumerable()检测属性是否可以枚举:
console.log(per3.propertyIsEnumerable("name")); //true var pros = Object.keys(per3); //返回可枚举属性的名字数组 console.log("length" in pros); //true console.log(pros.propertyIsEnumerable("length")); //false
属性name是自定义的,可枚举;属性length是Array.prototype的内建属性,不可枚举。
属性类型
属性有两种类型:数据属性和访问器属性。二者均具有四个属性特征:
数据属性:[[Enumerable]]、[[Configurable]]、[[Value]]和[[Writable]]
访问器属性:[[Enumerable]]、[[Configurable]]、[[Get]]和[[Set]]
**[[Enumerable]] :**布尔值,属性是否可枚举,自定义属性默认是true。
**[[Configurable]] :**布尔值,属性是否可配置(可修改或可删除),自定义属性默认是true。它是不可逆的,即设置成false后,再设置成true会报错。
**[[Value]]:**保存属性的值。
**[[Writable]]:**布尔值,属性是否可写,所有属性默认可写。
**[[Get]]:**获取属性值。
**[[Set]]:**设置属性值。
ES 5提供了两个方法用于设置这些内部属性:
Object.defineProperty(obj,pro,desc_map) 和 Object.defineProperties(obj,pro_map)。利用这两个方法为per3添加一个属性和创建一个新对象per4:
Object.defineProperty(per3,"sex",{ value:"male", enumerable:false, configurable:false, //属性不能删除和修改,该值也不能被设置成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, //报错 }); 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
需要注意的是,通过这两种方式来定义新属性时,如果不指定特征值,则默认是false,也不能创建同时具有数据特征和访问器特征的属性。可以通过Object.getOwnPropertyDescriptor()方法来获取属性特征的描述,接受两个参数:对象和属性名。若属性存在,则返回属性描述对象。
var desc = Object.getOwnPropertyDescriptor(per4,"name"); console.log(desc.enumerable); //false console.log(desc.configurable); //false console.log(desc.writable); //true
根据属性的属性类型,返回的属性描述对象包含其对应的四个属性特征。
禁止修改对象
对象和属性一样具有指导其行为的内部特征。其中,[[Extensible]]是一个布尔值,指明改对象本身是否可以被修改([[Extensible]]值为true)。创建的对象默认都是可以扩展的,可以随时添加新的属性。
ES5提供了三种方式:
Object.preventExtensions(obj):创建不可扩展的obj对象,可以利用Object.isExtensible(obj)来检测obj是否可以扩展。严格模式下给不扩展对象添加属性会报错,非严格模式下则添加失败。
Object.seal(obj):封印对象,此时obj的属性变成只读,不能添加、改变或删除属性(所有属性都不可配置),其[[Extensible]]值为false,[[Configurable]]值为false。可以利用Object.isSealed(obj)来检测obj是否被封印。
Object.freeze(obj):冻结对象,不能在冻结对象上添加或删除属性,不能改变属性类型,也不能写入任何数据类型。可以利用Object.isFrozen(obj)来检测obj是否被冻结。
注意:冻结对象和封印对象均要在严格模式下使用。
"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
注意,禁止修改对象的三个方法只对对象的自有属性有效,对原型对象的属性无效,仍然可以在原型上添加或修改属性。
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";
补充:
Object.seal(obj):封印對象,此時obj的屬性變成唯讀,不能新增、改變或刪除屬性(所有屬性都不可配置),其[[Extensible]]值為false,[[Configurable]]值為false。可以利用Object.isSealed(obj)來偵測obj是否已封印。
這容易讓人歧義,一般說屬性,我們都很容易理解為其值。
,希望樓主稍微修改一下,讓人更容易理解。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
我更推薦的是倒過來理解
Object.freeze 凍結對象,不能進行任何屬性和屬性值的增刪改。
Object.seal 封閉對象,和Object.freeze相比,可以修改已存在屬性的值。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是JS物件導向的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

WebStorm Mac版
好用的JavaScript開發工具