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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

1.通過對(duì)象字面量創(chuàng)建

var a = {}; //最簡單最直接的方法,是第二種的簡寫方式

2.通過object構(gòu)造函數(shù)創(chuàng)建

var a = new Object(); // 這行代碼創(chuàng)建了Object引用類型的一個(gè)新實(shí)例,然后把實(shí)例保存在變量a中。 a.name = 'pingfan'; console.log(a); // 此時(shí)打印出來的是{name: 'pingfan'}

3.通過Object.create(__proto__, propertiesObject)創(chuàng)建

var a = Object.create(null); // 新創(chuàng)建出來的對(duì)象的原型指向null,也就是沒有原型 console.log(a); // {}

__proto__ 是必填參數(shù),就是新創(chuàng)建出來的對(duì)象的原型。
propertiesObject是可選參數(shù),作用就是給新對(duì)象添加新屬性以及描述器。

4.通過工廠模式創(chuàng)建

實(shí)際上是把創(chuàng)建對(duì)象的方式放在了一個(gè)函數(shù)里面,然后通過這個(gè)函數(shù)返回出一個(gè)對(duì)象。代碼如下:

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的類型 // 用一個(gè)變量去接收函數(shù)返回的對(duì)象,var b = {name: 'pingfan', sayName:function(){ alert(this.name);}} b.sayName(); // 調(diào)用b對(duì)象的sayName方法。 我們可以把creatObject函數(shù)看作是一個(gè)工廠在制造商品,而return出來的就是商品(對(duì)象),而這個(gè)b就是買商品的人,當(dāng)我們買了一件商品的時(shí)候我們就可以去使用這件商品了

優(yōu)點(diǎn):可以重復(fù)調(diào)用creatObject函數(shù),解決了創(chuàng)建多個(gè)相似對(duì)象的問題。
缺點(diǎn):雖然它能創(chuàng)建多個(gè)相似的對(duì)象,但是不能識(shí)別這個(gè)對(duì)象屬于哪個(gè)類型。

5.使用構(gòu)造函數(shù)創(chuàng)建對(duì)象(Constructor)

對(duì)比工廠模式,它是工廠模式的進(jìn)化版,因?yàn)樗倭藙?chuàng)建對(duì)象的步驟(實(shí)際上創(chuàng)建了,隱藏了),也沒有return語句,代碼如下:

function CreatObject(name) { // 首字母要大寫,標(biāo)明這是一個(gè)構(gòu)造函數(shù)this.name = name;this.sayName = function() {console.log(this.name);};} var a = new CreatObject('pingfan'); // 使用new實(shí)例化構(gòu)造函數(shù) console.log(a) // CreatObject {name: "pingfan", sayName: ?} f代表的函數(shù) CreatObject代表的是對(duì)象類型 console.log(a instanceof Object); // true 解決了工廠模式不能判斷類型的問題 console.log(a instanceof CreatObject); // true console.log(a.constructor == CreatObject); //true

優(yōu)點(diǎn):
可以重復(fù)new實(shí)例化構(gòu)造函數(shù),解決了工廠模式不能判斷類型的問題
可以將構(gòu)造函數(shù)的實(shí)例標(biāo)識(shí)為某種特定的類型
采用new操作符調(diào)用構(gòu)造函數(shù)
函數(shù)中隱式地創(chuàng)建對(duì)象
將屬性和方法復(fù)制給了this對(duì)象
沒有return語句
缺點(diǎn):
實(shí)例對(duì)象都可以繼承構(gòu)造器函數(shù)中的屬性和方法。但是,同一個(gè)對(duì)象實(shí)例之間,無法共享屬性
構(gòu)造函數(shù)中的每個(gè)方法都要在實(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,也就意味著每一次實(shí)例都要?jiǎng)?chuàng)建一遍,怎么辦呢,繼續(xù)優(yōu)化唄。

6.使用原型模式(propotype)

因?yàn)闃?gòu)造函數(shù)創(chuàng)建對(duì)象也有缺點(diǎn)怎么辦呢?這時(shí)候原型就蹦了出來,解決了構(gòu)造函數(shù)的缺點(diǎn)。每個(gè)數(shù)據(jù)類型都是對(duì)象(undefined和null除外),而每個(gè)對(duì)象都是繼承自一個(gè)原型對(duì)象,只有null除外,它沒有自己的原型對(duì)象,最終的Object的原型為null,涉及到原型鏈知識(shí)點(diǎn)。代碼如下:

function CreatObject() { // 首字母要大寫,標(biāo)明這是一個(gè)構(gòu)造函數(shù) } CreatObject.prototype.name = 'pingfan'; CreatObject.prototype.sayName = function() {alert(this.name); }; var a = new CreatObject(); // 使用new實(shí)例化構(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對(duì)象會(huì)造成propotype.constructor屬性不會(huì)指向CreatObject構(gòu)造函數(shù),實(shí)例對(duì)象擁有一個(gè)[[prototype]]指針,指向的是最初的原型對(duì)象,如果重寫了原型對(duì)象,就相當(dāng)于切斷了構(gòu)造函數(shù)和最初原型對(duì)象之間的聯(lián)系

function CreatObject() { // 首字母要大寫,標(biāo)明這是一個(gè)構(gòu)造函數(shù) } CreatObject.prototype = {name: 'pingfan',love: ['lol','98k'],sayName: function() {alert(this.name);} } var a = new CreatObject(); // 使用new實(shí)例化構(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)點(diǎn):
方法不會(huì)重新創(chuàng)建。共享原型對(duì)象上的方法
缺點(diǎn):
不能初始化參數(shù)。共享原型對(duì)象上的屬性(比如屬性的值是一個(gè)數(shù)組,當(dāng)使用push方法添加元素的時(shí)候原數(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)點(diǎn):
以上問題都解決,該公用的公用,私用的私用
缺點(diǎn):
封裝性不是很好,

8.寄生構(gòu)造函數(shù)模式

寫法跟工廠模式和構(gòu)造函數(shù)模式很像,構(gòu)造函數(shù)的頭,工廠模式的身體,構(gòu)造函數(shù)的實(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 的對(duì)象。新創(chuàng)建的實(shí)例方法不引用 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)容還不錯(cuò),歡迎將生活随笔推薦給好友。