學(xué)習(xí)javascript面向?qū)ο?掌握創(chuàng)建對(duì)象的9種方式
本文為大家分享了javascript創(chuàng)建對(duì)象的9種方式,供大家參考,具體內(nèi)容如下
【1】使用Object構(gòu)造函數(shù)
[缺點(diǎn)]使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量重復(fù)代碼
var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); }
【2】使用對(duì)象字面量
[缺點(diǎn)]使用同一個(gè)接口創(chuàng)建很多對(duì)象,會(huì)產(chǎn)生大量重復(fù)代碼
var person = { name: "Nicholas", age : 29, job: "Software Engineer", sayName: function(){ alert(this.name); } };
【3】工廠模式:抽象了創(chuàng)建具體對(duì)象的過(guò)程,考慮到ECMAScript中無(wú)法創(chuàng)建類(lèi),開(kāi)發(fā)人員就發(fā)明了一種函數(shù),用函數(shù)來(lái)封裝以特定接口創(chuàng)建對(duì)象的細(xì)節(jié)
[缺點(diǎn)]解決了創(chuàng)建多個(gè)相似對(duì)象的問(wèn)題,但沒(méi)有解決對(duì)象識(shí)別的問(wèn)題
function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayname = function(){ alert(this.name); } return o; } var person1 = createPerson('Nicholas',29,'software Engineer'); var person2 = createPerson('greg',27,'doctor');
【4】構(gòu)造函數(shù)模式:沒(méi)有顯式地創(chuàng)建對(duì)象,直接將屬性和方法賦給了this對(duì)象,沒(méi)有return語(yǔ)句
[缺點(diǎn)]每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍
function Person(name,age,job){ this.name = name; this.age = age; this.jog = job; this.sayName = function(){ alert(this.name); }; //與聲明函數(shù)在邏輯上是等價(jià)的 //this.sayName = new Function('alert(this.name)'); } var person1 = new Person("Nicholas",29,"software Engineer"); var person2 = new Person("Greg",27,"doctor");
【4.1】構(gòu)造函數(shù)拓展模式:把函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部
[缺點(diǎn)1]在全局作用域中定義的函數(shù)實(shí)際上只能被某個(gè)對(duì)象調(diào)用,這讓全局作用域有點(diǎn)名不副實(shí)
[缺點(diǎn)2]若對(duì)象需要定義很多方法,就要定義很多全局函數(shù),這個(gè)自定義引用類(lèi)型就沒(méi)有封裝性可言
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName(){ alert(this.name); } var person = new Person('小火柴','20','student') person.sayName(); console.log(Person);
【5】原型模式:我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途是包含可以由特定類(lèi)型的所有實(shí)例共享的屬性和方法。如果按照字面意思來(lái)理解,prototype就是通過(guò)調(diào)用構(gòu)造函數(shù)而創(chuàng)建的對(duì)象實(shí)例的原型對(duì)象
function Person(){ Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "software Engineer"; Person.prototype.sayName = function(){ alert(this.name); } } var person1 = new Person(); person1.sayName();//"Nicholas" var person2 = new Person(); person2.sayName();//"Nicholas" alert(person1.sayName == person2.sayName);//true
【5.1】更簡(jiǎn)單的原型模式:為了減少不必要的輸入,也為了從視覺(jué)上更好地封裝原型的功能,用一個(gè)包含所有屬性和方法的對(duì)象字面量來(lái)重寫(xiě)整個(gè)原型對(duì)象。
[缺點(diǎn)]以這種方式重設(shè)constructor屬性會(huì)導(dǎo)致它的[[Enumerable]]特性被設(shè)置為true,默認(rèn)情況下原生的constructor屬性是不可枚舉的
function Person(){}; Person.prototype = { constructor : Person, name: "Nicholas", age: 29, job: "software Engineer", sayName : function(){ alert(this.name); } };
【5.2】解決enumerable問(wèn)題的原型模式
function Person(){}; Person.prototype = { name: "Nicholas", age: 29, job: "software Engineer", sayName : function(){ alert(this.name); } }; Object.defineProperty(Person.prototype,"constructor",{ enumerable : false, value : Person });
[原型模式缺點(diǎn)1]重寫(xiě)原型對(duì)象切斷了現(xiàn)有原型與已存在對(duì)象實(shí)例之間的聯(lián)系,它們引用的仍是最初的原型。
function Person(){} var friend = new Person(); Person.prototype = { constructor: Person, name: "Nicholas", age: 29, job: "Software Engineer", sayName: function(){ alert(this.name); } }; friend.sayName();//error
[原型模式缺點(diǎn)2]引用類(lèi)型屬性的共享性問(wèn)題突出
function Person(){} Person.prototype = { constructor: Person, name: "Nicholas", age: 29, job: "Software Engineer", friend : ["shelby","Court"], sayName: function(){ alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push("Van"); alert(person1.friends);//["shelby","Court","Van"]; alert(person2.friends);//["shelby","Court","Van"]; alert(person1.friends === person2.friends);//true
【6】組合模式:組合使用構(gòu)造函數(shù)模式和原型模式是創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式。構(gòu)造函數(shù)模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享的屬性。這種混成模式還支持向構(gòu)造函數(shù)傳遞參數(shù),是用來(lái)定義引用類(lèi)型的一種默認(rèn)模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = ["shelby","Court"]; } Person.prototype = { constructor: Person, sayName : function(){ alert(this.name); } } var person1 = new Person("Nicholas",29,"Software Engineer"); var person2 = new Person("Greg",27,"Doctor"); person1.friends.push("Van"); alert(person1.friends);// ["shelby","Court","Van"]; alert(person1.friends);// ["shelby","Court"]; alert(person1.friends === person2.friends);//false alert(person1.sayName === person2.sayName);//true
【7】動(dòng)態(tài)原型模式:把所有信息都封裝在構(gòu)造函數(shù)中,通過(guò)在構(gòu)造函數(shù)中初始化原型(僅在必要情況下),又保持了同時(shí)使用構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)。換句話說(shuō),可以通過(guò)檢查某個(gè)存在的方法是否有效,來(lái)決定是否要初始化原型。
[注意]使用動(dòng)態(tài)原型模式時(shí),不能使用對(duì)象字面量重寫(xiě)原型。如果在已經(jīng)創(chuàng)建了實(shí)例的情況下重寫(xiě)原型,那么就會(huì)切斷現(xiàn)有實(shí)例與新實(shí)例之間的聯(lián)系
function Person(name,age,job){ //屬性 this.name = name; this.age = age; this.job = job; //方法 if(typeof this.sayName != "function"){ Person.prototype.sayName = function(){ alert(this.name); }; } } var friend = new Person("Nicholas",29,"Software Engineer"); friend.sayName();
【8】寄生構(gòu)造函數(shù)模式:創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象
function Person(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var friend = new Person("Nicholas",29,"Software Engineer"); friend.sayName();//"Nicholas"
【寄生構(gòu)造函數(shù)模式應(yīng)用】創(chuàng)建一個(gè)具有額外方法的特殊數(shù)組。由于不能直接修改Array構(gòu)造函數(shù),因此可以使用這個(gè)模式
function SpecialArray(){ //創(chuàng)建數(shù)組 var values = new Array(); //添加值 values.push.apply(values,arguments); //添加方法 values.toPipedString = function(){ return this.join('|'); }; //返回?cái)?shù)組 return values; } var colors = new SpecialArray("red","blue","green"); alert(colors.toPipedString());//"red|blue|green"
【9】穩(wěn)妥構(gòu)造函數(shù)模式:所謂穩(wěn)妥對(duì)象指沒(méi)有公共屬性,而且其方法也不引用this的對(duì)象。穩(wěn)妥對(duì)象最適合在一些安全環(huán)境中(這些環(huán)境會(huì)禁止使用this和new)或者在防止數(shù)據(jù)被其他應(yīng)用程序改動(dòng)時(shí)使用。
function Person(name,age,job){ //創(chuàng)建要返回的對(duì)象 var o = new Object(); //可以在這里定義私有變量和函數(shù) //添加方法 o.sayName = function(){ alert(name); }; //返回對(duì)象 return o; } //在穩(wěn)妥模式創(chuàng)建的對(duì)象中,除了使用sayName()方法之外,沒(méi)有其他方法訪問(wèn)name的值 var friend = Person("Nicholas",29,"Software Engineer"); friend.sayName();//"Nicholas"
以上就是javascript創(chuàng)建對(duì)象的九種方式,希望對(duì)大家的學(xué)習(xí)有所幫助。
- js面向?qū)ο笾R?jiàn)創(chuàng)建對(duì)象的幾種方式(工廠模式、構(gòu)造函數(shù)模式、原型模式)
- 從面試題學(xué)習(xí)Javascript 面向?qū)ο螅▌?chuàng)建對(duì)象)
- js面向?qū)ο?多種創(chuàng)建對(duì)象方法小結(jié)
- 詳解JavaScript基于面向?qū)ο笾畡?chuàng)建對(duì)象(1)
- 詳解JavaScript基于面向?qū)ο笾畡?chuàng)建對(duì)象(2)
- JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)創(chuàng)建對(duì)象的方法分析
- JavaScript 三種創(chuàng)建對(duì)象的方法
- JS 創(chuàng)建對(duì)象(常見(jiàn)的幾種方法)
- js創(chuàng)建對(duì)象的幾種常用方式小結(jié)(推薦)
- javascript面向?qū)ο髣?chuàng)建對(duì)象的方式小結(jié)
相關(guān)文章
通過(guò)javascript獲取iframe里的值示例代碼
iframe里的值在實(shí)現(xiàn)一些比較特殊功能時(shí)需要獲取的,下面為大家詳細(xì)介紹下使用javascript獲取iframe里值的方法,感興趣的各位可以參考下哈2013-06-06uni-app實(shí)現(xiàn)web-view圖片長(zhǎng)按下載解決方案
uniapp的web-view中圖片無(wú)法長(zhǎng)按保存,IOS下是正常的,但是Android下長(zhǎng)按無(wú)反應(yīng),這篇文章主要介紹了uni-app實(shí)現(xiàn)web-view圖片長(zhǎng)按下載解決方案,需要的朋友可以參考下2023-09-09小程序按鈕避免多次調(diào)用接口和點(diǎn)擊方案實(shí)現(xiàn)(不用showLoading)
這篇文章主要介紹了小程序按鈕避免多次調(diào)用接口和點(diǎn)擊方案實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04JS中判斷字符串中出現(xiàn)次數(shù)最多的字符及出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇JS中判斷字符串中出現(xiàn)次數(shù)最多的字符及出現(xiàn)的次數(shù)的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06IE6 彈出Iframe層中的文本框“經(jīng)?!睙o(wú)法獲得輸入焦點(diǎn)
IE6間歇性精神障礙 彈出Iframe層中的文本框“經(jīng)?!睙o(wú)法獲得輸入焦點(diǎn)的解決方法。2009-12-12