javascript創(chuàng)建對象的3種方法
本文為大家分享了js創(chuàng)建對象的多種方法,分享個(gè)方法的優(yōu)劣,具體內(nèi)容如下
第一種創(chuàng)建對象的方式:
創(chuàng)建JSON對象
推薦使用的場合: 作為函數(shù)的參數(shù),臨時(shí)只用一次的場景。比如設(shè)置函數(shù)原型對象。
var object = {
name: "Eric",
age: 24,
sayHi: function(){
console.log("My name is "+ this.name + " this year is " + this.age + "years old.")
}
};
第二種創(chuàng)建對象的方式:
創(chuàng)建一個(gè)Object對象
var object = new Object();
object.name = "Eric";
object.age = 24;
object.sayHi = function(){....};
以上兩種創(chuàng)建對象方式的缺點(diǎn):不能作為對象創(chuàng)建的模板,也就是不能用new進(jìn)行構(gòu)造新對象。
第三種創(chuàng)建對象的方式:
function Person() {
this.name = "Eric";
this.age = 24;
this.sayHi = function(){
console.log(this.name);
}
}
var object1 = new Person();
var object2 = new Person();
這種創(chuàng)建對象方式解決了前兩種方式的缺點(diǎn),可以作為對象創(chuàng)建的模板,可以一直復(fù)用創(chuàng)建出多個(gè)對象。
new運(yùn)算符的作用:
執(zhí)行構(gòu)造函數(shù)(new后面的那個(gè)函數(shù)),在構(gòu)造函數(shù)內(nèi)部創(chuàng)建一個(gè)空對象
把上一部創(chuàng)建的空對象跟構(gòu)造函數(shù)的原型對象進(jìn)行關(guān)聯(lián)
然后把this指向當(dāng)前空對象
在構(gòu)造函數(shù)執(zhí)行結(jié)束后,如果沒有return,把空對象返回給object
new運(yùn)算符原理
第三種方式有個(gè)缺點(diǎn): 對象的內(nèi)部的函數(shù)會在每個(gè)對象中都存一份如果創(chuàng)建的對象非常多的話,那么非常浪費(fèi)內(nèi)存。函數(shù)的行為是所有對象可以共有,不需要每個(gè)對象都保存一份。所以,可以把函數(shù)放到原型中進(jìn)行聲明,那么所有對象都有了公共的函數(shù),而且內(nèi)存中只保留一份。所有的屬性寫到對象的內(nèi)部
第三種方式beta1:
function Person() {
this.name = 'Eric';
this.age = 24;
}
Person.prototype = {
sayHi: function() {
},
};
var object1 = new Person();
var object2 = new Person();
繼續(xù)升級 beta2 :
function Person(name,age) {
this.name = name || "";
this.age = age || "";
}
Person.prototype = {
sayHi: function() {
},
};
var object1 = new Person(name1,age1);
var object2 = new Person(name2,age2);
問題:1、調(diào)用者如果傳遞參數(shù)的順序發(fā)生變化,那么廢了
問題:2、參數(shù)增減都會導(dǎo)致函數(shù)聲明變化,調(diào)用的地方也可能發(fā)生變化。
如何解決:繼續(xù)升級 beta3 :
function Person(option) { //用一個(gè)對象把所有參數(shù)覆蓋
this.name = option.name || "";
this.age = option.age || "";
}
Person.prototype = {
sayHi: function() {
},
};
var object1 = new Person({
name: "Eric",
age: 24
});
var object2 = new Person({
name: "XXX",
age: xx
});
繼續(xù)優(yōu)化,把初始化的代碼 放到init函數(shù)中
繼續(xù)升級 beta4 :
function Person(option) {
this._init(option);
}
Person.prototype = {
_init: function (option){
this.name = option.name;
this.age = option.age;
},
sayHi: function(){
console.log("HI");
}
};
var object1 = new Person({
name: "Eric";
age: 24
});
object1.sayHi();
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript獲取系統(tǒng)自帶的顏色選擇器功能(圖)
JavaScript獲取系統(tǒng)自帶的顏色選擇器功能,這個(gè)是針對IE瀏覽器,所以大家如果想用兼容性更好的代碼,可以查看腳本之家的相關(guān)文章。2010-08-08
OpenCV.js實(shí)現(xiàn)喬丹動圖素描效果圖文教程
這篇文章主要為大家介紹了OpenCV.js實(shí)現(xiàn)喬丹動圖素描效果的圖文教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
JavaScript 參數(shù)中的數(shù)組展開 [譯]
有些時(shí)候,我們需要把一個(gè)數(shù)組展開成多個(gè)元素,然后把這些元素作為函數(shù)調(diào)用的參數(shù).JavaScript中可以使用Function.prototype.apply來實(shí)現(xiàn)這種展開操作,但它不能被應(yīng)用在執(zhí)行構(gòu)造函數(shù)的情況下.本文解釋了什么是展開操作以及如何在使用new運(yùn)算符的同時(shí)進(jìn)行展開操作2012-09-09
基于insertBefore制作簡單的循環(huán)插空效果
這是一個(gè)基于insertBefore制作簡單的循環(huán)插空效果,實(shí)現(xiàn)的數(shù)字下面循環(huán)插空效果,給需要的朋友分享。2015-09-09
js跨域和ajax 跨域問題的實(shí)現(xiàn)思路
大家都知道js是不能跨域的,但我們有時(shí)候就要這么用,怎么辦呢?辦法總是有的.2009-09-09
JavaScript實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

