js创建对象的几种方式(推荐)
1.通過對象字面量創(chuàng)建
var a = {}; //最簡單最直接的方法,是第二種的簡寫方式2.通過object構(gòu)造函數(shù)創(chuàng)建
var a = new Object(); // 這行代碼創(chuàng)建了Object引用類型的一個新實例,然后把實例保存在變量a中。 a.name = 'pingfan'; console.log(a); // 此時打印出來的是{name: 'pingfan'}3.通過Object.create(__proto__, propertiesObject)創(chuàng)建
var a = Object.create(null); // 新創(chuàng)建出來的對象的原型指向null,也就是沒有原型 console.log(a); // {}__proto__ 是必填參數(shù),就是新創(chuàng)建出來的對象的原型。
propertiesObject是可選參數(shù),作用就是給新對象添加新屬性以及描述器。
4.通過工廠模式創(chuàng)建
實際上是把創(chuàng)建對象的方式放在了一個函數(shù)里面,然后通過這個函數(shù)返回出一個對象。代碼如下:
function creatObject(name) {var a = new Object();a.name = name;a.sayName=function(){alert(this.name);};return a; } var b = creatObject('pingfan'); console.log(b instanceof creatObject); // false 判斷a的類型 // 用一個變量去接收函數(shù)返回的對象,var b = {name: 'pingfan', sayName:function(){ alert(this.name);}} b.sayName(); // 調(diào)用b對象的sayName方法。 我們可以把creatObject函數(shù)看作是一個工廠在制造商品,而return出來的就是商品(對象),而這個b就是買商品的人,當(dāng)我們買了一件商品的時候我們就可以去使用這件商品了優(yōu)點:可以重復(fù)調(diào)用creatObject函數(shù),解決了創(chuàng)建多個相似對象的問題。
缺點:雖然它能創(chuàng)建多個相似的對象,但是不能識別這個對象屬于哪個類型。
5.使用構(gòu)造函數(shù)創(chuàng)建對象(Constructor)
對比工廠模式,它是工廠模式的進化版,因為它少了創(chuàng)建對象的步驟(實際上創(chuàng)建了,隱藏了),也沒有return語句,代碼如下:
function CreatObject(name) { // 首字母要大寫,標(biāo)明這是一個構(gòu)造函數(shù)this.name = name;this.sayName = function() {console.log(this.name);};} var a = new CreatObject('pingfan'); // 使用new實例化構(gòu)造函數(shù) console.log(a) // CreatObject {name: "pingfan", sayName: ?} f代表的函數(shù) CreatObject代表的是對象類型 console.log(a instanceof Object); // true 解決了工廠模式不能判斷類型的問題 console.log(a instanceof CreatObject); // true console.log(a.constructor == CreatObject); //true優(yōu)點:
可以重復(fù)new實例化構(gòu)造函數(shù),解決了工廠模式不能判斷類型的問題
可以將構(gòu)造函數(shù)的實例標(biāo)識為某種特定的類型
采用new操作符調(diào)用構(gòu)造函數(shù)
函數(shù)中隱式地創(chuàng)建對象
將屬性和方法復(fù)制給了this對象
沒有return語句
缺點:
實例對象都可以繼承構(gòu)造器函數(shù)中的屬性和方法。但是,同一個對象實例之間,無法共享屬性
構(gòu)造函數(shù)中的每個方法都要在實例上重新創(chuàng)建一遍,封裝性不好,原因如下:
由上可見a.sayName !== b.sayName,也就意味著每一次實例都要創(chuàng)建一遍,怎么辦呢,繼續(xù)優(yōu)化唄。
6.使用原型模式(propotype)
因為構(gòu)造函數(shù)創(chuàng)建對象也有缺點怎么辦呢?這時候原型就蹦了出來,解決了構(gòu)造函數(shù)的缺點。每個數(shù)據(jù)類型都是對象(undefined和null除外),而每個對象都是繼承自一個原型對象,只有null除外,它沒有自己的原型對象,最終的Object的原型為null,涉及到原型鏈知識點。代碼如下:
function CreatObject() { // 首字母要大寫,標(biāo)明這是一個構(gòu)造函數(shù) } CreatObject.prototype.name = 'pingfan'; CreatObject.prototype.sayName = function() {alert(this.name); }; var a = new CreatObject(); // 使用new實例化構(gòu)造函數(shù) var b = new CreatObject(); console.log(a.name); // a pingfan console.log(b.name); // b pingfan console.log(b.propotype.constructor); // CreatObject() console.log(a.sayName === b.sayName); // true a和b都可以公用sayName方法propotype是構(gòu)造函數(shù)CreatObject的屬性,而consructor則是構(gòu)造函數(shù)的prototype的屬性它所指向的是CreatObject構(gòu)造函數(shù)
重寫CreatObject.prototype對象會造成propotype.constructor屬性不會指向CreatObject構(gòu)造函數(shù),實例對象擁有一個[[prototype]]指針,指向的是最初的原型對象,如果重寫了原型對象,就相當(dāng)于切斷了構(gòu)造函數(shù)和最初原型對象之間的聯(lián)系
優(yōu)點:
方法不會重新創(chuàng)建。共享原型對象上的方法
缺點:
不能初始化參數(shù)。共享原型對象上的屬性(比如屬性的值是一個數(shù)組,當(dāng)使用push方法添加元素的時候原數(shù)組被改變了)
7.組合模式
構(gòu)造函數(shù)模式與原型模式的一起來,代碼如下:
function CreatObject(name) {this.name = name; } CreatObject.prototype = {constructor: CreatObject,getName: function () {console.log(this.name);} }; var a = new CreatObject('pingfan'); var b = new CreatObject('xiaoran'); console.log(a); // CreatObject {name: "pingfan"} a.getName(); // pingfan b.getName(); // xiaoran console.log(a.getName === b.getName); // true優(yōu)點:
以上問題都解決,該公用的公用,私用的私用
缺點:
封裝性不是很好,
8.寄生構(gòu)造函數(shù)模式
寫法跟工廠模式和構(gòu)造函數(shù)模式很像,構(gòu)造函數(shù)的頭,工廠模式的身體,構(gòu)造函數(shù)的實例,推薦特殊情況下使用
function Person(name) {var o = new Object();o.name = name;o.getName = function () {console.log(this.name);};return o; }var person1 = new Person('pingfan'); console.log(person1 instanceof Person) // false console.log(person1 instanceof Object) // true9.穩(wěn)妥構(gòu)造函數(shù)模式
沒有公共屬性,而且其方法也不引用 this 的對象。新創(chuàng)建的實例方法不引用 this,也不使用 new 操作符調(diào)用構(gòu)造函數(shù)
function person(name){var o = new Object();o.getName = function(){console.log(name);};return o; }var person1 = person('kevin'); person1.getName(); // kevin person1.name = "daisy"; person1.getName(); // kevin console.log(person1.name); // daisy--------------------------------------------------------------------------------------(完)-------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的js创建对象的几种方式(推荐)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自律的本质
- 下一篇: layui表格自定义分页