JavaScript面向物件精要(一)
傳統面向物件的語言幾大特徵:封裝、繼承、多型,在JavaScript中並不適用。JavaScript的弱型別特徵允許你用比其他語言更少的程式碼完成同樣的任務。無需提前設計好類再進行編碼。需要一個具有某個欄位的物件了?隨時隨地都可建立。Nicholas
C.Zakas著作《JavaScript面向物件精要》告知我們如何建立物件、定義自己的型別,使用繼承以及其他各種操作來充分使用物件。總之,更全面理解和使用JavaScript所有的一切。
一、原始型別和引用型別
1. 什麼是型別
JavaScript雖然沒有類的概念,但依然存在兩種型別:原始型別和引用型別。
原始型別儲存為簡單資料值;引用型別則儲存為物件,其本質是指向記憶體位置的引用。
var obj = new Object();
變數實際上並不包含物件的例項,而是一個指向記憶體中實際物件所在位置的指標(或者說引用)。這是物件和原始值之間的一個基本區別。原始值都是直接儲存在變數中。
附:關於變數詳見【變數、作用域和記憶體問題】
2. 內建型別例項化
示例:物件字面形式
var obj1 = {};
var obj2 = new Object();
物件字面量,JavaScript引擎背後做的工作挺new Object()
一樣,除了沒有呼叫建構函式。
示例:正則表示式字面形式
var reg1 = /^\d+$/g;
var reg2 = new RegExp ("^\\d+$", "g");
reg2.toString(); // "/^\d+$/g"
reg2.source; // "^\d+$"
使用字面下個形式建立正則,無需擔心字串中的轉義字元。如果使用RegExp建構函式,傳入模式的引數是一個字串,需要轉移。
3. 訪問屬性
示例:對待特殊字元的屬性
var obj = {
"ab": "yes",
"a$b": "yes",
"abc": "yes"
};
obj.ab; // "yes"
obj["a$b"]; // "yes"
var name = "abc";
obj[name]; // "yes"
“中括號”可以處理動態決定訪問哪個屬性以及訪問包含特殊字元的屬性;其他方面同“點號”大致相同。
4. 鑑別引用型別
鑑別引用型別使用instanceof操作符。
示例:陣列
Array.isArray()
[] instanceof Array
5. 原始封裝型別
示例:自動建立的基本包裝型別
var name = "string";
name instanceof String; // false
new String("string") instanceof String; // true
臨時物件,僅在值被讀取時建立,然後立即被銷燬。instanceof操作符並沒有真的讀取任何東西。
二、函式
函式也是物件。使函式不同於其他物件的特性是其內部具有[[Call]]
屬性。該屬性無法通過程式碼訪問而是定義了程式碼執行時的行為。ECMAScript定義typeof操作符對任何具有[[Call]]
屬性的物件返回“function”。
示例:判斷是否為function
typeof function(){}; // "function"
typeof /\./; // "object"
注意:某些瀏覽器曾經在正則表示式中包含[[Call]]屬性,導致其被錯誤鑑別為函式。
1. 函式提升
宣告本身會被提升,而包括函式表示式的賦值在內的賦值操作並不會提升;後面的函式宣告可以覆蓋前面的。
示例:函式提升
a(); // "a..."
b(); // Uncaught TypeError: b is not a function(…)
function a(){
console.log("a");
};
function a(){
console.log("a...");
};
var b = function(){
console.log("b");
}
2. 改變this
示例:obj擁有sayName()方法
var obj = {
name: "obj",
sayName: function(age){
console.log("my name is:" + this.name + ",age: " + age);
}
}
(1)call()方法
var obj1 = {name: "call"};
obj.sayName.call(obj1, 25); // my name is:call,age: 25
(2)apply()方法
var obj2 = {name: "apply"};
obj.sayName.apply(obj2, [25]); // my name is:apply,age: 25
(3)bind()方法
var obj3 = {name: "bind"};
var sayName = obj.sayName.bind(obj3);
sayName(25); // my name is:bind,age: 25
注意:call()
、apply()
立即執行,bind()
返回一個函式,並不是立即執行。
關於函式。詳見,【JavaScript提升(你不知道的JavaScript)】、【函式表示式】
三、理解物件
1. 定義屬性
當一個屬性第一次被新增給物件時,JavaScript在物件上呼叫一個名為[[Put]]的內部方法;當一個已有的屬性被賦予一個新值時,呼叫的是一個名為[[Set]]
的方法。
var person = {};
person.name = "lg"; // 呼叫[[Put]]
person.name = "ligang"; // 呼叫[[Set]]
2. 屬性探測
if(person.age){
// do something with age
}
當值是一個null、undefined、0、false、NaN或空字串時評估為假。由於一個物件屬性可以包含這些假值,所以上述示例可能導致錯誤的假定。注意,這個問題在短路&&同樣存在。
if(age in person){
// do something with age
}
in
操作符是探測物件中屬性是否存在的最好途徑,且不會評估屬性的值。
3. 屬性型別
屬性有兩種型別:資料屬性和訪問器屬性。
如果只需要儲存資料,通常沒有什麼理由使用訪問器屬性–直接使用屬性本身即可。但當你希望賦值操作會觸發一些行為或者讀取的值需要通過計算所需的返回值得到時,訪問器屬性會非常有用。
var person = {
_name: "lg"
};
Object.defineProperty(person, "name", {
get: function(){
console.log("my name is:" + this._name);
return this._name;
},
set: function(name){
this._name = "愛新覺羅" + name;
}
});
// 等價
var person = {
_name: "lg",
get name(){
console.log("my name is:" + this._name);
return this._name;
},
set name(name){
this._name = "愛新覺羅" + name;
}
};
person.name; // my name is:lg
person.name = "ligang";
person.name; // my name is:愛新覺羅ligang
Vue正式通過Object.defineProperty()
對屬性進行監聽、通知處理。
注意:建立一個同時具有資料特徵和訪問器特徵的屬性,會得到一個錯誤。
相關推薦
JavaScript面向物件精要(一)
傳統面向物件的語言幾大特徵:封裝、繼承、多型,在JavaScript中並不適用。JavaScript的弱型別特徵允許你用比其他語言更少的程式碼完成同樣的任務。無需提前設計好類再進行編碼。需要一個具有某個欄位的物件了?隨時隨地都可建立。Nicholas
JavaScript面向物件精要(二)
四、建構函式和原型物件 1. 建構函式 建構函式就是用new建立物件時呼叫的函式。使用建構函式的好處在於所有用同一個建構函式建立的物件都具有同樣的屬性和方法。 function Person(){} var p1 = new Person(); c
javaScript面向物件程式設計-繼承(一)
類有三部分 建構函式內的,供例項化物件複製用的 建構函式外的,直接通過點語法新增的,供類使用,例項化物件訪問不到 類的原型中的,例項化物件可以通過其原型鏈間接地訪問到,也是供所有例項化物件所共用的。 類式繼承 類的原型物件的作用就是為類的原型新增共有方法,但類不
JavaScript基礎——面向物件的程式設計(一)建立物件的幾種方式總結
簡介 面向物件(Object-Oriented, OO)的語言有一個標誌,那就是它們都有類的概念,而通過類可以建立任意多個具有相同屬性和方法的物件。前面提到過,ECMAScript中沒有類的概念,因此它的物件也與基於類的語言中的物件有所不同。 ECMA-262把物件定義為:
javascript面向對象筆記(一)
str false 無序 cnblogs 位置 ont 多個 say http ECMAscript對象(以下簡稱對象): ECMA-262把對象定義為:無序屬性的集合,其屬性可以包含基本值、對象或者函數。 對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。值可以
Python面向物件和類(一)
面向物件程式設計 Ojbect-Oriented Programing 什麼是物件: 物件是指現實中的物體過實體 物件有什麼特徵: 物件有很多屬性(名詞,形容詞)  
javaScript面向物件程式設計-繼承(二)
原型繼承 原型繼承是對類式繼承的一種封裝,其中的過渡物件就相當於類式繼承中的子類,只是在原型式中作為一個過渡物件出現,目的是建立要返回的新的例項化物件。和類式繼承一樣,父類物件book中指型別的屬性被複制,引用型別的屬性被共有。 //原型是繼承 function i
JavaScript面向物件程式設計-繼承(三)
寄生組合式繼承(終極繼承者) 前面學習了類式繼承和建構函式繼承組合使用,也就是組合繼承,但是這種繼承方式有個問題,就是子類不是父類的例項,而子類的原型是父類的例項。子類不是父類例項的問題是由類式繼承引起的。因此還有一種更好的繼承方式,那就是寄生組合式繼承,也就是寄生
Java面向物件程式設計思想(一)
宣告:學基礎,在校學生,本文所有內容來自純書本,然後通過自己的理解和參考編寫而來,如有說的不對的地方,歡迎評論指錯!(僅做學習交流) 類和物件的建立 類的建立:(public private protected)+ class + 類名 { <類
讀《JavaScript 面向物件精要》和《JavaScript 啟示錄》精華總結
導讀:本文詳細總結了JavaScript 面向物件基礎的知識點,主要來自《JavaScript 面向物件精要》《JavaScript 啟示錄》這兩本書,推薦給各位做做開發的朋友。 目錄 引子: 最近看了兩本書,書中有些內容對自己還是很新的
JavaScript面向物件之繼承(下)
原型式繼承 這種繼承方式沒有使用嚴格意義上的建構函式,藉助原型還可以基於已有的物件建立新物件,同時還不必因此建立自定義型別 function object(o) { function Fun() {} Fun.prototype = o; return n
Java面向物件設計模式(一)——工廠方法模式
工廠方法模式(Factory Method) 工廠方法模式分為三種: 1、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖: 舉例如下:(我們舉一個傳送郵件和簡訊的例子) 首先,建立二者的共同介面: publici
C#之淺析面向物件程式設計思想(一)
縱觀MicroSoft公司的幾種主流語言,C是面向過程,VB既有面向過程也有面向物件的特性,而C#則是純粹的面向物件的程式語言。在UML的學習過程中,畫類圖、物件圖的時候面向物件的思想就已經用到了具體的學習中,而C#的學習過程中我們接著深入來學習這種思想,只不過這次是
JAVA面向物件學習筆記(一)
1、方法: 1)方法不能獨立定義,方法只能在類體裡定義; 2)從邏輯意義上看,方法要麼屬於該類本身,要麼屬於該類的一個物件; 3)永遠不能獨立執行方法,只想方法必須使用類或物件作為呼叫者; 4)static修飾的方法不能訪
面向物件學習心得(一)
學習零件價格求和小程式心得:1.養成好習慣,編寫java程式之前建一個包package com.zjs;2.有關ArrayList動態陣列的知識:List list=new ArrayList();有關函式:list.add();list.remove();......使用I
面向物件設計原則(一)——單一職責原則
單一職責原則定義(Single Responsibility Principle,SRP) 一個物件應該只包含 單一的職責,並且該職責被完整地封裝在一個類中。 Every Object should have a single responsibility, an
王玉蘭201771010128《面向物件與程式設計(Java)》第十一週學習總結
一:理論知識部分: (1)集合:集合(Collection或稱為容器)是一種包含多個元素並提供對所包含元素操作方法的類,其包含的元素可以由同一型別的物件組成,也可以由不同型別的物件組成。 A:集合類的作用:– Java的集合類提供了一些基本資料結構的支援。– 例如Vector、Hashtabl
《JavaScript高階程式設計》筆記:面向物件的程式設計(六)
面向物件的語言有一個標誌,那就是它們都有類的概念,而通過類可以建立任意多個具有相同屬性和方法的物件。 理解物件 建立自定義物件的最簡單的方法就是建立一個Object的例項,然後再為它新增屬性和方法。例如: var person = new Object(); person.name="N
C++面向物件- -類和物件的使用(一)
這部分算是正式接觸了類和物件,涉及到它們基礎的應用。 目錄 建構函式對類物件進行初始化 1、物件的初始化 2、建構函式實現資料成員的初始化 3、帶引數的建構函式 4、引數初始化表對資料成員的初始化 5、建構函式的過載 6、使用預設引數的建構函式 解構函式