詳解js創(chuàng)建對象的幾種方式和對象方法
這篇文章是看js紅寶書第8章,記的關(guān)于對象的筆記(第二篇)。
創(chuàng)建對象的幾種模式:
工廠模式:
工廠是函數(shù)的意思。工廠模式核心是定義一個返回全新對象的函數(shù)。
function getObj(name, age) { let obj = {} obj.name = name obj.age = age return obj } let person1 = getObj("cc", 31)
缺點:不知道新創(chuàng)建的對象是什么類型
構(gòu)造函數(shù)模式:
通過一個構(gòu)造函數(shù),得到一個對象實例。
構(gòu)造函數(shù)和工廠模式區(qū)別是:
1,構(gòu)造函數(shù)函數(shù)體加了this
2,構(gòu)造函數(shù)沒有return
3,構(gòu)造函數(shù)調(diào)用時,用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ù)的兩個問題:
1,構(gòu)造函數(shù)和普通函數(shù)唯一區(qū)別是調(diào)用方式。構(gòu)造函數(shù)要用new關(guān)鍵字。如果不用new,則是往Global對象上加屬性。下面例子中,CreateObj方法,往window對象上加了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)建一個實例,都會創(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()
但是,這樣會讓自定義類型引用的代碼不能很好聚在一起。
原型模式:
原理是,每個函數(shù)都有一個prototype屬性。prototype是一個對象,里面定義的屬性和方法會被所有實例共享。
關(guān)于原型模式,有兩個等式:
function Person() { } let person1 = new Person() console.log(person1.__proto__ === Person.prototype) // true console.log(Person.prototype.constructor === Person); // true
關(guān)于原型對象的三個方法:isPrototype , getPrototypeof,setPrototypeOf, Object.create()
// isPrototypeOf判斷構(gòu)造函數(shù)的原型對象是否是實例的原型對象 function Person() {} let person1 = new Person() console.log(Person.prototype.isPrototypeOf(person1)); // true
// 獲取對象的原型對象 function Person() {} let person1 = new Person() console.log(Object.getPrototypeOf(person1) === Person.prototype);
// 將某個對象,設(shè)為另一個對象的原型對象 let person1 = {name: "cc"} let person2 = {age: 32} Object.setPrototypeOf(person1,person2) console.log(person1.name, person1.age); // cc 32
// 以某個對象為原型對象,創(chuàng)建一個新對象 let person1 = {name: "cc"} let person2 = Object.create(person1) person2.age = 30 console.log(person2.name, person2.age);
當(dāng)訪問一個對象person的name屬性時,是按照以下步驟去訪問:
1,person上如果有name屬性(即便這個屬性是null,也會返回null),返回name屬性值;沒有,繼續(xù)去原型對象Person.prototype上找
2,如果原型上有name屬性,返回原型上name屬性值;沒有,則返回undefined
判斷一個屬性是在實例上,還是在原型上,可以用hasOwnProperty
function Person() {} Person.prototype.name = "cc" let person1 = new Person() console.log(person1.name) // 'cc' console.log(person1.hasOwnProperty("name")); // false
判斷一個對象上是否有個某個屬性,用in操作符
// 對象自身 or 原型上找到,都返回true function Person() {} Person.prototype.name = "cc" let person1 = new Person() console.log("name" in person1) // true console.log(person1.hasOwnProperty("name")); // false
訪問對象的屬性的方法:
Object.keys( ) for ... in // 繼承屬性也會遍歷出來 Object.getOwnPropertyNames(obj) // 會列出可枚舉和不可枚舉屬性,其他和 Object.keys( )結(jié)果一樣 Object.getOwnPropertySymbols(obj) // 和getOwnPropertyNames類似,只是僅針對symbol Reflect.ownKeys(obj) // 和Object.keys( )結(jié)果一樣
其他訪問對象屬性和屬性值的方法:
Object.values( ) 對象值組成的數(shù)組,會省掉Symbol型。
Object.entries( ) 對象鍵值對組成的數(shù)組,會將鍵,轉(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)建對象的幾種方式和對象方法的文章就介紹到這了,更多相關(guān)js創(chuàng)建對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用JavaScript實現(xiàn)node.js中的path.join方法
Node.JS中的 path.join 非常方便,能直接按相對或絕對合并路徑,有時侯前端也需要這種方法,如何實現(xiàn)呢?感興趣的朋友跟隨腳本之家小編一起看看吧2018-08-08javascript刪除html標(biāo)簽函數(shù)cIsHTML
這篇文章主要介紹了javascript刪除html標(biāo)簽函數(shù)cIsHTML,需要的朋友可以參考下2017-01-01js檢測標(biāo)題與描述中的關(guān)鍵詞發(fā)現(xiàn)就替換或跳轉(zhuǎn)到別的頁面
這篇文章主要介紹了js檢測標(biāo)題與描述中的關(guān)鍵詞發(fā)現(xiàn)就替換或跳轉(zhuǎn)到別的頁面的實現(xiàn)方法,主要是分享它的編程思路與加密方法2021-06-06js表格排序?qū)嵗治觯ㄖС謎nt,float,date,string四種數(shù)據(jù)類型)
這篇文章主要介紹了js表格排序?qū)嵗治觯ㄖС謎nt,float,date,string四種數(shù)據(jù)類型),涉及javascript常用的升序、降序及數(shù)據(jù)類型轉(zhuǎn)換等相關(guān)技巧,需要的朋友可以參考下2015-05-05