2016-06-09 5 views
0

인스턴스와 클래스 변수에 대해 혼란스러워합니다. 나는 나에게 모순되는 것처럼 보이기 위해 바이올린을 만들었다. 나는 서브 클래스의 속성으로 배열을 선언하는 문제에 대해 잘 알고있어Backbone.js 인스턴스와 클래스 변수

https://jsfiddle.net/njcfm4n8/1/

, 그것은 그렇지 않으면 배열은 모든 인스턴스에서 공유의 initialize 기능에서이 작업을 수행해야합니다. 바이올린은 그것을 보여줍니다. 그러나 number 속성이 공유되지 않는 이유는 무엇입니까?

답변

2

muistooshort 및 maris의 설명에 따르면, 배열은 참조 유형이기 때문에 클래스 속성처럼 작동합니다. 이 배열은 모델 인스턴스간에 실제로 공유되지만, 이것은 백본을 사용하여 클래스 변수를 만드는 의도 된 방식이 아니라 자바 스크립트의 특징입니다.

반면 정수는 부울 및 문자열과 함께 기본 유형이며 javascript는 이러한 유형에 대한 참조를 전달하지 않고 대신 복사합니다.

배열, 객체 및 함수는 참조 유형이며 정수, 부울 값, null 및 undefined는 값 유형입니다. 당신은 여기에 대해 자세히 알아볼 수 있습니다 : http://docstore.mik.ua/orelly/webprog/jscript/ch04_04.htm

당신은 클래스 속성의 사용을 확인하려면 백본 문서의 다음이 부분은 관련이 : http://backbonejs.org/#Model-extend

extendBackbone.Model.extend (속성, [classProperties ])

자신 만의 Model 클래스를 만들려면 Backbone.Model을 확장하고 인스턴스 속성뿐만 아니라 선택적 classProperties를 제공하여 생성자 함수에 직접 첨부해야합니다.

이 코드 여기 https://jsfiddle.net/zn6bu4uf/3/ 당신의 jsfiddle을 갈래했습니다

var myModel = Backbone.Model.extend({}, {foo: 0}) 

console.log(myModel.foo); // 0 
myModel.foo++; 
console.log(myModel.foo); // 1 

var test1 = new myModel(); 
var test2 = new myModel(); 

test1.constructor.foo++; 
test1.constructor.foo++; 

test2.constructor.foo++; 

console.log(test1.constructor.foo) // 4 
console.log(test2.constructor.foo) // 4 
+1

난 당신이 잘못된 "클래스 변수"용어에 정신이되는 것 같아요. 실제 문제는 프로토 타입의 배열에서'push'를 호출하면 그 자리에서 배열을 수정하지만 프로토 타입의 숫자에 '++'를 사용하면 프로토 타입에서 벗어납니다 (즉, 새로운 값을 인스턴스에 복사하지 않고 프로토 타입의 값). –

+0

@muistooshort 네 말이 맞아, 고마워. 배열이 클래스 변수로 작동하는 것처럼 보이지만 이는 객체이고 자바 스크립트는 객체를 복사하는 대신 객체에 대한 참조를 사용하기 때문입니다. 따라서 실제로는 클래스간에 공유되지만 의도적으로는 공유되지 않습니다. 나는 그것을 반영하기 위해 나의 대답을 편집 할 것이다. –

+2

더 정확한 것은 부울, int는 값 유형이고 object와 array는 참조 유형입니다. – Maris

1

등뼈가 myModel 프로토 타입에 속성 (narr)를 추가합니다.

모든 myModel 개체는 에 narr이 있으며 액세스 할 수 있습니다.

배열이 저장된 위치를 지정하지 않아 개체간에 공유되는 배열입니다. Push는 배열 자체를 변경합니다.

하지만 실제로 새 값을 생성 한 다음이를 객체에 할당합니다.

사양에서

: test1.n++ 실제로 (그것이 test1.__proto__ ...에서 검색되지 않은 경우)과 가상 변수 old_val 저장이

  1. 객체 test1에서 부동산 n을 얻을 할 것입니다.
  2. 사양 3 단계 속성 n의 초기 위치를 확인하지 않음으로써 new_val
  3. old_val

의 값으로 가상 변수 new_val 개체 "TEST1"부동산 n의 설정치

  • old_val + 1로 설정. test1에 새 속성이 추가됩니다.

    사양은

  • 관련 문제