日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js创建对象的几种方式(推荐)

發(fā)布時間:2023/12/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js创建对象的几种方式(推荐) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)建一遍,封裝性不好,原因如下:

var b = new CreatObject('xiaoran'); console.log(a.name); // pingfan console.log(b.name); // xiaoran console.log(a.sayName === b.sayName ); //false !!!!注意這里

由上可見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)系

function CreatObject() { // 首字母要大寫,標(biāo)明這是一個構(gòu)造函數(shù) } CreatObject.prototype = {name: 'pingfan',love: ['lol','98k'],sayName: function() {alert(this.name);} } var a = new CreatObject(); // 使用new實例化構(gòu)造函數(shù) var b = new CreatObject(); a.love.push('you') console.log(a.love); // a lol,98k,you console.log(b.love); // b lol,98k,you console.log(a.sayName === b.sayName); // true a和b都可以公用sayName方法 console.log(b.propotype.constructor); // undefined

優(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) // true

9.穩(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。