2013-06-09 2 views
0

조작을 위해 비어있는 새 개체를 만들려고 할 때 이전 데이터를 가져올 수 없습니다.JavaScript에서 새 빈 개체 만들기

가 여기에 내가 무엇을 시도했다의 예입니다

이제
function Foo() { 
    this.Bar = Bar; 
    // etc.. 
} 

var Bar = { 
    __words : {}, 
    addWord : function (word, amount) { 
     this.__words[word] = amount; 
    } 
    // etc.. 
} 

, 나는 새로운 개체를 만들 때 : 나는 또한 Object.create()를 사용하여 시도

var foo = new Foo(); 
var bar = foo.Bar; 
bar.addWord("hello",7); 
bar.addWord("world",9); 

var lorem = new Foo(); 
var words = lorem.Bar.__words; // This will display {hello:7,world:9} from the 
           // previous object 

을하지만 여전히 그대로였다, 이전 개체에서 __words을 보여줍니다.

+0

콘솔 로그? 내 생각에,'var Bar'는 클래스 정의 이전에 있어야합니다. – karthikr

+0

객체가 참조로 전달 되었기 때문에'this.Bar = clone (Bar) '와 같은 새로운 인스턴스마다 복제해야합니다. – elclanrs

+0

@elclanrs : 'clone()'이라고 써야합니다. – SLaks

답변

4

개체 BarFoo 인스턴스간에 공유 의해 참조.

정말 두 개체에 로직을 넣어 지점이 표시되지 않습니다, 당신은 단지 하나의 생성자 함수와 함께이 작업을 수행 할 수 있습니다 당신이 정말로 기능을 분리해야하는 경우

function Foo() { 
    this.__words = {}; 
} 

Foo.prototype.addWord = function(word, amount) { 
    this.__words[word] = amount; 
} 


var foo = new Foo(); 
foo.addWord("hello",7); 

var bar = new Foo(); 
bar.addWord("world",9); 

는 다음 Bar을 생성자 함수도 생성하고 Foo 생성자 메서드 내부에 새 인스턴스를 만듭니다.

function Foo() { 
    this.bar = new Bar(); 
} 


function Bar() { 
    this.__words = {}; 
} 

Bar.prototype.addWord = function(word, amount) { 
    this.__words[word] = amount; 
} 
0

이전 데이터를 가져올 수 없습니다.

그럼 당신은 글로벌 실제로 var Bar 삭제되지 않습니다 - 당신이 var lorem = new Foo();로 새로운 객체를 생성하지만 그에게, FOOS 생성자와 같은 바 개체를 제공하는 것을 의미합니다.

this.Bar = Bar; 

새 개체를 원하면 Foo에 자체 Bar 개체를 제공해야합니다. 또는은 다음과 같습니다 : 푸 자체

__words : {}, 
    addWord : function (word, amount) { 
     this.__words[word] = amount; 

.

어쨌든 한 번만 필요하면 Bar의 단어 배열을 비울 수 있습니다.

0

코드에 몇 가지 문제가 있습니다.

function Foo() { 
    this.Bar = Bar; 
    // etc.. 
} 

var Bar = { 
    __words : {}, 
    addWord : function (word, amount) { 
     this.__words[word] = amount; 
    } 
    // etc.. 
} 

바 푸 전에 정의되어야하지만, 변수가 실제로이 특정 예에서 문제가되지 않을 수도 기능 범위 수준에서 정의되어 있기 때문에 문제없이 작동 할 수 있습니다.

즉, Foo 생성자 내에서 객체를 복사한다고합니다. 객체는 변경 가능하므로 작동하지 않습니다. 객체를 한 번 변경하면 다른 객체가 변경됩니다. 당신이 할 수있는 일은 이것입니다. 새로운 것을하지 않고 할 수있는 다른 방법이 있습니다.

var Bar = { 
    create: function() { 
     var obj = Object.create(this); 
     obj.__words= {}; 
     return obj; 
    }, 

    addWord: function (word, amount) { 
     this.__words[word] = amount; 
    } 
    ...other methods... 
}; 

var Foo = function() { 
    this.Bar = Bar.create(); 
    // etc.. 
}; 

다른 브라우저에서는 Object.create이 어떻게 지원되는지 잘 모릅니다. 이 구문은 Felix가 작성한 것과 동일하므로 명확하게 두 객체의 필요성을 제거 할 수 있습니다.

유일한 차이점은 새로운 Bar()를 작성하는 것입니다. 실제로 프로토 타입 개체를 만들고 프로토 타입에서 개체를 만드는 중입니다. create는 생성자입니다.

같은 방법으로 Foo를 작성하면 다음과 같은 결과를 얻을 수 있습니다.

var Bar = { 
    create: function() { 
     var obj = Object.create(this); 
     obj.__words= {}; 
     return obj; 
    }, 

    addWord: function (word, amount) { 
     this.__words[word] = amount; 
    }, 
    ...other methods... 
}; 

var Foo = { 
    create: function() { 
     var foo = Object.create(this); 
     foo.Bar = Bar.create(); 
     return foo; 
    }, 
    .... 
}; 

var foo1 = Foo.create(); 
var foo2 = Foo.create(); 

foo1.bar.addWord("allo", 3); 

나는 모든 것이 당신이 그러나 "새로운"통신 사업자를 통해 몇 가지 장점 등의 방법을 만들려고하는지에 따라 달라집니다 같아요. 예를 들어 객체 생성 후에 콜백을 실행하는 비동기 메서드를 만들 수 있습니다.

자세한 내용은 여기를 참조하십시오. 결국 그것은 거의 똑같습니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

+0

해결책은 작동하지 않습니다. 'Bar .__ words'의 객체는'Object.create (Bar)'로 생성 한 모든 인스턴스가 공유합니다. 방금 문제를 한 단계 멀리 옮겼습니다 (말하자면). –

+0

아, 프로토 타입이 복사되고 객체 참조도 있습니다. –

관련 문제