詳解js建立物件的幾種方式和物件方法
這篇文章是看js紅寶書第8章,記的關於物件的筆記(第二篇)。
建立物件的幾種模式:
工廠模式:
工廠是函式的意思。工廠模式核心是定義一個返回全新物件的函式。
function getObj(name,age) { let obj = {} obj.name = name obj.age = age return obj } let person1 = getObj("cc",31)
缺點:不知道新建立的物件是什麼型別
建構函式模式:
通過一個建構函式,得到一個物件例項。
建構函式和工廠模式區別是:
1,建構函式函式體加了this
2,建構函式沒有return
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
關於建構函式的兩個問題:
1,建構函式和普通函式唯程式設計客棧一區別是呼叫方式。建構函式要用new關鍵字。如果不用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,建構函式存在的問題: 建構函式體內的方法,每次建立一個例項,都會建立一遍。
person1.sayName( ) === person2.sayName( ) // false
解決方法是,將sayName定義在createObj外面。
function sayName() { console.log(this.name) } function CreatePerson(name,age) { this.name = name this.age = age this.sayhttp://www.cppcns.comName = sayName } let person1 = new CreatePerson('jhttp://www.cppcns.comoy',31) person1.sayName()
但是,這樣會讓自定義型別引用的程式碼不能很好聚在一起。
原型模式:
原理是,每個函式都有一個prototype屬性。prototype是一個物件,裡面定義的屬性和方法會被所有例項共享。
關於原型模式,有兩個等式:
function Person() { } let person1 = new Person() console.log(person1.__proto__ === Person.prototype) // true console.log(Person.prototype.constructor === Person); // true
關於原型物件的三個方法:isPrototype , getPrototypeof,setPrototypeOf,Object.create()
// isPrototypeOf判斷建構函式的原型物件是否是例項的原型物件 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);
// 將某個物件,設為另一個物件的原型物件 let person1 = {name: "cc"} let person2 = {age: 32} Object.setPrototypeOf(person1,person2) console.log(person1.name,person1.age); // cc 32
// 以某個物件為原型物件,建立一個新物件 let person1 = {name: "cc"} let person2 = Object.create(person1) person2.age = 30 console.log(person2.name,person2.age);
當訪問一個物件person的name屬性時,是按照以下步驟去訪問:
1,person上如果有name屬性(即便這個屬性是null,也會返回null),返回name屬性值;沒有,繼續去原型物件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 原型上找到,都返回truAHSMNLmpqe
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( )結果一樣 Object.getOwnPropertySymbols(obj) // 和getOwnPropertyNames類似,只是僅針對symbol Reflect.ownKeys(obj) // 和Object.keys( )結果一樣
其他訪問物件屬性和屬性值的方法:
ObjectAHSMNLmpq.values( ) 物件值組成的陣列,會省掉Symbol型。
Object.entries( ) 物件鍵值對組成的陣列,會將鍵,轉化成字串,省掉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 ] ]
到此這篇關於詳解js建立物件的幾種方式和物件方法的文章就介紹到這了,更多相關js建立物件內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!