詳解js創(chuàng)建對(duì)象的幾種方式和對(duì)象方法
這篇文章是看js紅寶書第8章,記的關(guān)于對(duì)象的筆記(第二篇)。
創(chuàng)建對(duì)象的幾種模式:
工廠模式:
工廠是函數(shù)的意思。工廠模式核心是定義一個(gè)返回全新對(duì)象的函數(shù)。
function getObj(name, age) {
let obj = {}
obj.name = name
obj.age = age
return obj
}
let person1 = getObj("cc", 31)
缺點(diǎn):不知道新創(chuàng)建的對(duì)象是什么類型
構(gòu)造函數(shù)模式:
通過一個(gè)構(gòu)造函數(shù),得到一個(gè)對(duì)象實(shí)例。
構(gòu)造函數(shù)和工廠模式區(qū)別是:
1,構(gòu)造函數(shù)函數(shù)體加了this
2,構(gòu)造函數(shù)沒有return
3,構(gòu)造函數(shù)調(diào)用時(shí),用new關(guān)鍵字
function CreateObj(name, age) {
this.name = name
this.age = age
}
let person1 = new CreateObj("cc", 31)
console.log(person1)
console.log(person1.constructor === CreateObj); // true
console.log(person1 instanceof CreateObj); // true
關(guān)于構(gòu)造函數(shù)的兩個(gè)問題:
1,構(gòu)造函數(shù)和普通函數(shù)唯一區(qū)別是調(diào)用方式。構(gòu)造函數(shù)要用new關(guān)鍵字。如果不用new,則是往Global對(duì)象上加屬性。下面例子中,CreateObj方法,往window對(duì)象上加了name和age屬性
function CreateObj(name, age) {
this.name = name
this.age = age
}
CreateObj('cc', 10)
console.log(window.name) // 'cc'
2,構(gòu)造函數(shù)存在的問題: 構(gòu)造函數(shù)體內(nèi)的方法,每次創(chuàng)建一個(gè)實(shí)例,都會(huì)創(chuàng)建一遍。
person1.sayName( ) === person2.sayName( ) // false
解決方法是,將sayName定義在createObj外面。
function sayName() {
console.log(this.name)
}
function CreatePerson(name, age) {
this.name = name
this.age = age
this.sayName = sayName
}
let person1 = new CreatePerson('joy', 31)
person1.sayName()
但是,這樣會(huì)讓自定義類型引用的代碼不能很好聚在一起。
原型模式:
原理是,每個(gè)函數(shù)都有一個(gè)prototype屬性。prototype是一個(gè)對(duì)象,里面定義的屬性和方法會(huì)被所有實(shí)例共享。
關(guān)于原型模式,有兩個(gè)等式:
function Person() { }
let person1 = new Person()
console.log(person1.__proto__ === Person.prototype) // true
console.log(Person.prototype.constructor === Person); // true
關(guān)于原型對(duì)象的三個(gè)方法:isPrototype , getPrototypeof,setPrototypeOf, Object.create()
// isPrototypeOf判斷構(gòu)造函數(shù)的原型對(duì)象是否是實(shí)例的原型對(duì)象
function Person() {}
let person1 = new Person()
console.log(Person.prototype.isPrototypeOf(person1)); // true
// 獲取對(duì)象的原型對(duì)象
function Person() {}
let person1 = new Person()
console.log(Object.getPrototypeOf(person1) === Person.prototype);
// 將某個(gè)對(duì)象,設(shè)為另一個(gè)對(duì)象的原型對(duì)象
let person1 = {name: "cc"}
let person2 = {age: 32}
Object.setPrototypeOf(person1,person2)
console.log(person1.name, person1.age); // cc 32
// 以某個(gè)對(duì)象為原型對(duì)象,創(chuàng)建一個(gè)新對(duì)象
let person1 = {name: "cc"}
let person2 = Object.create(person1)
person2.age = 30
console.log(person2.name, person2.age);
當(dāng)訪問一個(gè)對(duì)象person的name屬性時(shí),是按照以下步驟去訪問:
1,person上如果有name屬性(即便這個(gè)屬性是null,也會(huì)返回null),返回name屬性值;沒有,繼續(xù)去原型對(duì)象Person.prototype上找
2,如果原型上有name屬性,返回原型上name屬性值;沒有,則返回undefined
判斷一個(gè)屬性是在實(shí)例上,還是在原型上,可以用hasOwnProperty
function Person() {}
Person.prototype.name = "cc"
let person1 = new Person()
console.log(person1.name) // 'cc'
console.log(person1.hasOwnProperty("name")); // false
判斷一個(gè)對(duì)象上是否有個(gè)某個(gè)屬性,用in操作符
// 對(duì)象自身 or 原型上找到,都返回true
function Person() {}
Person.prototype.name = "cc"
let person1 = new Person()
console.log("name" in person1) // true
console.log(person1.hasOwnProperty("name")); // false
訪問對(duì)象的屬性的方法:
Object.keys( ) for ... in // 繼承屬性也會(huì)遍歷出來 Object.getOwnPropertyNames(obj) // 會(huì)列出可枚舉和不可枚舉屬性,其他和 Object.keys( )結(jié)果一樣 Object.getOwnPropertySymbols(obj) // 和getOwnPropertyNames類似,只是僅針對(duì)symbol Reflect.ownKeys(obj) // 和Object.keys( )結(jié)果一樣
其他訪問對(duì)象屬性和屬性值的方法:
Object.values( ) 對(duì)象值組成的數(shù)組,會(huì)省掉Symbol型。
Object.entries( ) 對(duì)象鍵值對(duì)組成的數(shù)組,會(huì)將鍵,轉(zhuǎn)化成字符串,省掉Symbol型。
function Person() {}
Person.prototype.name = "cc"
let person = new Person()
person.age = 21
let sy = Symbol('sy')
person[sy] = 'smile'
console.log(Object.values(person)) // [ 21 ]
console.log(Object.entries(person)) // [ [ 'age', 21 ] ]
到此這篇關(guān)于詳解js創(chuàng)建對(duì)象的幾種方式和對(duì)象方法的文章就介紹到這了,更多相關(guān)js創(chuàng)建對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用Javascript同時(shí)提交多個(gè)Web表單的方法
使用Javascript同時(shí)提交多個(gè)Web表單的方法2009-12-12
layui使用templet格式化表格數(shù)據(jù)的方法
今天小編就為大家分享一篇layui使用templet格式化表格數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09
javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法分析
這篇文章主要介紹了javascript稀疏數(shù)組(sparse array)和密集數(shù)組用法,分析javascript稀疏數(shù)組和密集數(shù)組的功能、定義與使用方法,需要的朋友可以參考下2016-12-12
json數(shù)據(jù)與字符串的相互轉(zhuǎn)化示例
json與字符串之間的轉(zhuǎn)換,在使用中經(jīng)常會(huì)遇到,本文有個(gè)不錯(cuò)的示例,大家可以參考下,或許會(huì)有所幫助2013-09-09
輕量級(jí)的原生js日歷插件calendar.js使用指南
網(wǎng)頁上的原生js日歷代碼,鼠標(biāo)點(diǎn)擊文字提示處,會(huì)顯示一個(gè)帶年月日的日歷窗口,可調(diào)整年份、月份、選擇日期等,用在網(wǎng)頁上方便大家選擇日期,提高用戶體驗(yàn)。各大瀏覽器都能正常運(yùn)行,有需要的小伙伴可以參考下。2015-04-04
js中scrollTop()方法和scroll()方法用法示例
這篇文章主要介紹了js中scrollTop()方法和scroll()方法用法,結(jié)合實(shí)例形式分析了scrollTop()方法和scroll()方法滾動(dòng)操作的用法與相關(guān)操作技巧,需要的朋友可以參考下2016-10-10

