iT邦幫忙

1

我寫一個類,但我發現這樣子就是實例化了三次,我這樣是不是很消耗內存,這種方法是不太好的,因為getname方法重覆再使用,也被複製了三次,有更節省內存的寫法嗎?(抱歉我高三實在看不懂那些高級的寫法)

  • 分享至 

  • xImage

var Member = function(firstname,lsatname){
this.firstname = firstname;
this.lastname = lastname;
this.getname = function(){
this.firstname+this.lastname;}
};

var num1 = new Member("kouichi","usui");
console.log(num.getname);

var num2 = new Member("Nami","kakeya");
console.log(num.getname);

var num3 = new Member("Tosi","jojo");
console.log(num.getname);

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2024-08-09 12:09:25 檢舉
3個不同個體當然是要實例化3次,要不然還能怎麼做?
除非你是要確保一次只能有一個實例存在。否則不用考慮這種事。

去查設計模式的單例模式
https://ithelp.ithome.com.tw/articles/10203092
Yaowen iT邦研究生 4 級 ‧ 2024-08-09 12:20:34 檢舉
單例模式
https://refactoringguru.cn/design-patterns/singleton
好的,謝謝搂,看來單利模式是最好的解法
froce iT邦大師 1 級 ‧ 2024-08-09 14:06:31 檢舉
不是單例模式是最好的解法,是在正確的情境下要選用什麼模式去做處理。
你也可以定義一個跟類分開的函式或類別方法去做組合而不是綁在實例中,跟著實例化去佔用記憶體,這一切是看你的設計時的狀況。
類別方法:
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Classes

單例模式是用在有時會需要一個全局的實例,譬如某個database連線,或是會佔用唯一的硬體,但你必須在不同的地方去調用這個實例的狀況。
為了確保每次在存取的時候都是用到同一個實例(所以叫做單例,單一實例),會在類別裡面創建實例的時候判斷是不是在其他地方有創建過了。

你舉的例子就是三個成員,三個成員不同,getname都一樣,你會覺得這會佔用記憶體,但改天你寫其他語言用到繼承覆寫方法,你就會慢慢知道為啥會綁在實例上,而不是類方法了。
Yaowen iT邦研究生 4 級 ‧ 2024-08-09 14:35:34 檢舉
其實內存要消化完機率不高 (因為有 gc) , 最常會遇到的例子是database連線 ,因為 database 有連線數的上限,如果不使用單例 , 每次 Query 資料都 new 連線那連線數很快就爆了
wade2432 iT邦新手 5 級 ‧ 2024-08-09 14:46:30 檢舉
你的需求實例化三次是對的沒問題, 你舉的例子應該是不需要用單例模式的
dophintil iT邦新手 4 級 ‧ 2024-08-09 14:56:15 檢舉
你舉的類別是放資料為主,開多例沒什麼問題。
如果是做特定處理例如排序、加總、轉型等工具,就沒必要多例了
builder iT邦新手 1 級 ‧ 2024-08-10 15:20:28 檢舉
似乎可以把方法放到原型鍊上~ 讓不同實體共用這個方法~ 節省記憶體

function Person(name) {
this.name = name;
}

// 將方法添加到原型上
Person.prototype.sayName = function() {
alert("My name is " + this.name);
};

var instance1 = new Person('Peter');
instance1.sayName();

var instance2 = new Person('Jack');
instance2.sayName();
var Robot = function(){};

Robot.prototype = {
walk = console.log("滴答滴答");
}

var Tesla = function(){
Robot.call(this);
};

var Tesla = new Bobot();

Tesla.prototype.navigater = function(){
console.log("開啟自動導航,不要撞牆");
}

var Teslamodel3 = new Tesla();
Teslamodel3.navigator();
Teslamodel3.walk();
有了有了,其實在你說原型鏈的時候我根本不知道那是啥,我又去書上學了一下,是這樣的概念嗎?@builder
感謝force,雖然沒有學到單利只搞到原型鏈,但也有去查了一下單利的概念,沒操作過就是了
@yaowen有聽過query,但我還沒學那個咚咚,我只知道那就是資料庫,對了,能問一個關於資工出路的問題嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
greenriver
iT邦研究生 5 級 ‧ 2024-08-09 16:19:50

by ChatGPT

var Member = function(firstname, lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
};

Member.prototype.getname = function() {
    return this.firstname + this.lastname;
};

var num1 = new Member("kouichi", "usui");
var num2 = new Member("Nami", "kakeya");
var num3 = new Member("Tosi", "jojo");

建議使用新的寫法,如下

class Member {
    constructor(firstname, lastname) {
        this.firstname = firstname;
        this.lastname = lastname;
    }

    getname() {
        return this.firstname + this.lastname;
    }
}

const num1 = new Member("kouichi", "usui");
const num2 = new Member("Nami", "kakeya");
const num3 = new Member("Tosi", "jojo");

這兩個方法都不會造成重複複製getname

這是es2015的寫法呢,我發現我的技術沒跟上新時代腳步

我要發表回答

立即登入回答