簡體   English   中英

Javascript屬性作為對其他對象屬性的引用

[英]Javascript property as reference to other object's property

有沒有一種方法可以將一個對象的屬性分配為對另一個對象的屬性的引用,並且可以動態地進行分配? 請注意,在for循環中,我跳過了與第二個對象同名的所有屬性。 我正在開發一個框架,該框架會將JSON緩存為具有行為的對象,並允許進行ORM行為,在這里我可以將緩存的對象和集合作為其他緩存對象的屬性來獲取。 我需要跳過某些屬性以避免循環引用。

var obj1 = {
    prop1: "hey",
    obj2:"you",
    prop2: "come over here"
}

var obj2 = {}

for(var prop in obj1){
    if(prop != 'obj2'){
        obj2[prop] = obj1[prop];
    }
}
console.log(obj1);
console.log(obj2);

obj1.prop2 = "come on, man";

console.log(obj1);
console.log(obj2);
//obj1 is unchanged in output.  I would like to be able to update it by mutating obj2's properties

小提琴: http : //jsfiddle.net/6ncasLb0/1/

如果無法做到這一點,是否可以在不更改原始對象的情況下刪除或更改引用的屬性? 我知道,也許不是。 在黑暗中只是一槍。

我想您可以找到的最接近的方法是,確保要更改的屬性與在兩個對象上獲得的屬性相同,因此,您需要做一些工作以確保它們在彼此“認識”時實例化(例如,從原始對象克隆)

例如,您可以使用這樣的簡化模型,盡管在對象上定義的新屬性應該很好,但在其創建中標記的任何屬性也會更新原始對象。 請注意,枚舉和僅引用屬性是行不通的,至少不能用於字符串(當從一個對象復制到另一個對象時,對象會發生變化)

 ; (function(namespace) { function addProperty(obj, property, valueholder) { Object.defineProperty(obj, property, { get: function() { return valueholder[property]; }, set: function(val) { valueholder[property] = val; }, enumerable: true, configurable: false }); } var model = namespace.model || function(options) { if (typeof options === 'undefined') { options = {}; } var propHolder = options.container || {}, prop; if (typeof options.props != null) { for (prop in options.props) { if (options.props.hasOwnProperty(prop)) { addProperty(this, prop, propHolder); propHolder[prop] = options.props[prop]; } } }; namespace.model.prototype.clone = function() { var options = { props: {}, container: propHolder }, prop; for (prop in this) { if (this.hasOwnProperty(prop)) { options.props[prop] = this[prop]; } } return new namespace.model(options); }; namespace.model.prototype.toString = function() { var prop, msg, props = []; for (prop in propHolder) { if (propHolder.hasOwnProperty(prop)) { props.push(prop + ': "' + this[prop].toString() + '"'); } } return '[Model] {' + props.join(', ') + '}'; } return this; }; namespace.model = model; }(window)); var obj1 = new model({ props: { prop2: "come over here" } }); obj1.prop1 = 'Hey'; obj1.obj2 = 'You'; obj1.test = { a: 10 }; var obj2 = obj1.clone(); console.log('-- before changes --'); console.log(obj1.toString()); console.log(obj2.toString()); obj2.prop2 = "come on, man"; obj2.prop1 = "won't change"; obj2.obj2 = "also not"; obj2.test.b = "both have this now"; console.log('-- after changes --'); console.log(obj1.toString()); console.log(obj2.toString()); console.log(obj1.test); console.log(obj2.test); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM