2017-10-29 75 views
5

Nesneleri, bu nedenle değişkenin her bir örneği benzersiz olması gerekir.JavaScript İhracat -. Değişkenler somutlaştırın/Evimde 5 tonları var ben devlete izleyebilmeniz için bir değişken eklemek için <code>homebridge-wink3</code> kodunu değiştirmek çalışıyorum

shade.js dosyasında;

exports.default = ({ Characteristic, Service }) => { 
    return { 
    type: "shade", 
    group: "shades", 
    services: [{ 
     service: Service.WindowCovering, 
     characteristics: [{ 
     characteristic: Characteristic.TargetPosition, 
     get: (state, desired_state) => desired_state.position * 100, 

ben değiştirmek istiyorum get (ve set başka yerde kodunda) bu yüzden devlet izlemek için yerel bir değişken lastState kullanır.

get: (state, desired_state) => { 
       if (desired_state.position != null) { 
         lastState = desired_state.position * 100; 
       } 
       else if (lastState != undefined) { 
         desired_state.position = lastState/100; 
       } 
       return lastState; 

ben kod gölgede başına bireysel değişkenler (nesne örneği) korumak için nasıl çalışmaya çalışıyorum saat geçirdim, ama her zaman lastState değişkenin aynı örneğini paylaşımı gibi görünüyor.

Burada ne yapmam gerekiyor? Kod için https://github.com/sibartlett/homebridge-wink3/blob/master/src/devices/shade.js adresine bakın.

+0

LastState değişkenini nerede tanımladınız? –

+0

@ JorgeFuentesGonzález Henüz bir yer yok. Benim sorum bu soruyor. Nerede ve nasıl ilan edeceğim? Kod, ES7'de yazılmıştır ve orijinal 'exports.default', bir grup parametreyi (tür, grup, hizmetler []) döndürmek için görüntülenir. 'Get' parametresinin/fonksiyonunun' set' parametresi/fonksiyonu tarafından ayarlanabilen bir yerel değişkene (benim örneğimde; 'lastState') erişimi olması gerekir. – mriksman

+1

Ben bir homebridge-wink3' kullanıcısı değilim, ama yardım etmek için elimden geleni yaparım. Sorun şu ki, şu ana kadar ne denediğini bilmiyorum ve saatlerce denediğin aynı şeyi yapmaya çalışan zaman kaybetmek istemiyorum. Bunun hakkında düşünmem genellikle StackOverflow üyelerinin geri kalanının ne düşündüğünü, yani, şimdiye kadar ne denediniz? –

cevap

1

Önemli: Ne sorunuzun anlıyorum Bir nesneyi (lastState veya get ve set yöntemi ile nesne) klonlamak istiyorum olmasıdır. Şimdi

var A = { 
     aVariable: "Panem et circencem", 
     aMethod: function() { 
     return (["Veni", "vidi", "vici"]); 
     } 
    }; 

, ben bir nesne B.

function clone(obj) { 
    if (null == obj || "object" != typeof obj) return obj; 
    var copy = obj.constructor(); 
    for (var attr in obj) { 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
    } 
    return copy; 
} 

var B = clone(A); 

Bu örnek bir örnektir nesne A klonlamak istediğinizi varsayalım:

Böyle bir nesne A var varsayalım

 
 
var A = { 
 
    aVariable: "Panem et circencem", 
 
    aMethod: function() { 
 
    return (["Veni", "vidi", "vici"]); 
 
    } 
 
}; 
 
function clone(obj) { 
 
    if (null == obj || "object" != typeof obj) return obj; 
 
    var copy = obj.constructor(); 
 
    for (var attr in obj) { 
 
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr]; 
 
    } 
 
    return copy; 
 
} 
 

 
var B = clone(A); 
 
B.aVariable = "Ad gloriam"; 
 
console.log(B); 
 
console.log (A);

Ardından, nesnelerinizde bazı ayırt edici özelliklerin olması için ya da kodunuzdaki lastState klonlamasını yapmak için tüm nesnenizi kopyalayabilir/kopyalayabilirsiniz. Sorunun bu bölümünü anlamadım, afedersiniz.

Not:bu soruyu yanıtlamayı deneyin. Soruyu anlamıyorsam, lütfen bana bir yorum söyle.

Ayrıca dikkat edin: Soruya cevap yoksa, senin Yukarıdaki kod Poste kullanmakta serbesttirler ve soruyu cevaplamak için benim yazı kopyalayın.

Aynı şekilde not: Eğer bir sorunuz varsa, bana bir yorum söyle.

Sadece iade ifade yukarıda lastState ilan edebilir
+0

Klonlamak istemiyorum. Sorun 'exports.default' (Bence) kullanımıdır. Kodunuz, bu "ES7" koduna doğrudan bağlanamayan "commonJS" (??) gibi görünüyor. Soruyu cevaplamak için yapılacak en iyi şey, sorumu listelediğim bağlantıyı açmaktır. Bu "shade.js" dosyasını çağıran şeyi, nesne/modül/aygıtın nasıl örneklendiğini ve bu örneklenmiş nesnelerin her biri için bir yerel değişkende ('lastState') durumu nasıl izleyeceğimi öğrenebilmelisiniz. – mriksman

+0

'exports.default' işlevi bir işlev olduğu anlamına gelir. İşlev (benim soruma göre gösterilmektedir), sadece bir parametre listesi döndüren bir 'dönüş 'fonksiyonudur. ES6'da ve bu işlevde, nesnenin/modülün/aygıtın ömrü boyunca devam edecek bir değişkeni nasıl ekleyebilirim? – mriksman

+0

@mriksman, Nesnenin ömrü boyunca ısrar ederek ne demek istiyorsun? –

1

,

let lastState; 
return { 
    type: "shade", 
    group: "shades", 

veya ihracat deyimi yukarıda

,

let lastState; 
export default ({ Characteristic, Service }) => { 

Eğer 5 örneklerini oluşturmak nereye aynı kapsamda lastState ilan etmeleri halinde Daha sonra hepsi aynı lastState paylaşacaktır.

+0

İlki, homebridge-wink3'ün nasıl çalıştığına bağlı. Belki de, bir kez dışa aktarma işlemini çalıştırır ve daha sonra her zaman aynı kapsamı paylaşarak geri dönüşü önbelleğe alır. Ayrıca, ikincisi, node.js'de yalnızca 1 kez kod çalıştırıldığı ve ihracatın önbelleğe alındığı için aynı kapsamı aynı şekilde paylaşacaktır, bu nedenle dışa aktarma dışına çıkan şey, dışa aktarma içindeki her şey için aynı kapsamdır. –

+0

'Kapsamları' ve ES6 ve ES7'yi anlayan birisinin github'daki koduna hızlı bir şekilde baktığından eminim ve ... sorunu hızlı bir şekilde belirleyebilecektim. Yeteneklerim bu ihracat ve kapsamla ilgili şeyleri çizecek kadar basit değil. Ben commonJS ile zar zor yetenekliyim, ama bu benim için yeni ... – mriksman

+0

Önerilen cevabı denediniz mi? – Pratheep

İlgili konular