物件的實質是一組名值對,其中值可以為資料或函式。當值為資料時,對應的名被稱為物件的屬性;當值為函式時,對應的名被稱為物件的方法。
通過object()類建立物件
通過物件字面量建立物件let person = new
object()
person.name = "guagua"
person.age = 18
person.say = function
()person.say()
通過物件字面量建立物件的方式更加體現了物件是一組名值對的本質。var person =
}person.say()
物件的屬性又具有一些描述自身的屬性,該屬性可分為兩類:資料屬性和訪問器屬性。
資料屬性
屬性名作用
configurable
表示能否通過delete刪除屬性而重新定義屬性,直接在物件上新增屬性時,預設為true
enumerable
表示屬性是否可列舉,即能否通過for-in迴圈返回屬性,直接在物件上新增屬性時,預設為true
writeable
表示能否修改屬性值,直接在物件上新增屬性時,預設為true
value
屬性的值
物件的屬性可以之間通過物件.屬性名
的方式新增,但如果需要設定屬性的屬性時,就需要定義。
object.defineproperty可以在為物件新增屬性的同時定義該屬性的資料屬性,如下:
訪問器屬性let person = {};
object.defineproperty(person,"name",)
訪問器屬性的值為兩個函式。
屬性名作用
get讀取屬性值時呼叫的函式
set設定屬性值時呼叫的函式
定義訪問器的方式如下,需要注意的是,訪問器屬性不能和資料屬性同名,否則會有衝突。
定義多個屬性object.defineproperty(person,'age',,
set:function
(value)
})
獲取屬性的特性let person = {}
object.defineproperties(person,,
_age:,
age:,
set:function
(newage)
}})
工廠模式console.log(object.getownpropertydescriptor(person,"_age").value)//22
console.log(object.getownpropertydescriptor(person,"_age").writable)//true
弊端:不能解決物件的識別問題,即無法得知物件的型別。function
teacher
(name,age)
}}let teacher1 = teacher('tom',34)
let teacher2 = teacher('mary',25)
建構函式模式
constructor屬性function
teacher
(name,age)
}let teacher1 = new teacher('tom',34)
teacher1.say()
instanceof操作符//物件的constructor屬性指向其建構函式
console.log(teacher1.constructor == teacher)//true
弊端:新建例項時,建構函式的每個屬性和方法都會在例項上重新建立一遍,不同的例項之間無法擁有共享的屬性和方法。//instanceof 用於判斷物件是否為某個類的例項
console.log(teacher1 instanceof teacher)//true
用new操作符建立物件時都做了什麼?
新建空物件
將物件的隱式原型proto屬性指向建構函式的prototype
將建構函式的作用域設定為該物件
執行建構函式中的**,為物件新增屬性
返回該物件。
原型模式
原型模式的思想是,為每個函式新增乙個prototype屬性,這個屬性指向乙個物件,該物件中儲存的是建構函式的例項物件的共享方法和屬性。
自定義乙個建構函式後,該建構函式的原型物件預設只有constructor屬性,指向建構函式,其它屬性都是從object物件繼承而來的。function
teacher
(name,age)
teacher.prototype =
}let teacher1 = new teacher('tom',34)
let teacher2 = new teacher('mary',35)
console.log(teacher1.say == teacher2.say)
但如果顯示指定了原型物件的話,原型物件的constructor屬性則會改變。function
teacher
(name,age)
console.log(teacher.prototype.constructor)//[function: teacher]
顯式原型和隱式原型
getprototypeof()
該函式返回給定物件的原型。物件例項的原型即物件建構函式的原型物件。
isprototypeof()function
teacher
(name,age)
let teacher1 = new teacher('tom',34)
console.log(object.getprototypeof(teacher1) == teacher.prototype)//true
isprototypeof() 方法用於測試乙個物件是否存在於另乙個物件的原型鏈上。
hasownproperty()console.log(object.prototype
.isprototypeof(teacher1))//所有物件都繼承自object物件
檢測物件的某一屬性是存在於例項中還是存在於原型中。
console.log(teacher1.hasownproperty('name'))//true
for in 迴圈
返回所有能過通過物件訪問的可列舉屬性,既包括物件存在於物件例項中的屬性,也包括存在於原型中的屬性。
object.create()function
teacher
(name,age)
teacher.prototype =
let teacher1 = new teacher('tom',34)
for(attr in teacher1)
//name,age,nation
使用指定的原型物件及其屬性去建立乙個新的物件。
object.setprototypeof()function
person
(name,age)
var person1 = object.create(person.prototype);
console.log(person1 instanceof person)//true
設定乙個物件的原型為另乙個物件或null。
function
person
(name,age)
var person1 = {}
object.setprototypeof(person1,person.prototype)
console.log(person1 instanceof person)//true
JavaScript中的String物件
string物件提供的方法用於處理字串及字元。常用的一些方法 charat index 返回字串中index處的字元。indexof searchvalue,fromindex 該方法在字串中尋找第一次出現的searchvalue。如果給定了fromindex,則從字串內該位置開始搜尋,當searc...
javaScript中物件的轉殖
今天做了一道題,題目如下 var obj var newobj obj newobj.value obj.key alert newobj.value 問題是結果是alert的結果是多少 這個地方是物件的引用 2個物件會共用乙個位址,物件名就是該物件的首位址,這個地方相當於陣列 位址相同,改變obj...
JavaScript中的Math物件
math物件 math物件為我們提供了許多數學相關的功能,例如獲得乙個數字的平方或者產生乙個隨機數。math物件和date與string物件有兩點不同 l你不能顯式的建立乙個math物件,你只直接使用它就可以了。lmath物件不儲存資料,和string 與date物件不同。你可以按照下面的格式來呼叫...