2013-05-02 4 views
0

먼저 자바 스크립트의 프로토 타입 구조를 완전히 이해하지 못해서 이것이 가능하지 않을 수 있습니다. 내가 cube.x를 호출하면 cube.position.x에 해당한다는 obj 등에 속성 x을 추가하는 방법을 내가 가지고있는 경우객체의 속성에 대한 프로토 타입의 자바 스크립트 설정 속성

...

var vector = function(x, y) { 
    this.x = x || 0; 
    this.y = y || 0; 
} 

var obj = function() { 
    this.position = new vector(0, 0, 0); 
} 

var cube = new obj(); 

.... 각 참조의 속성을 동일한 값으로 만들 수 있어야한다고 생각하지만 구문에 대해서는 확실하지 않습니다. obj.position이 정의되지 않았기 때문에 obj.prototype.x = obj.position.x과 같은 것을 사용할 수 없습니다.

나는 다음과 같은 동작이 가능 싶습니다

alert(cube.position.x); // 0 
alert(cube.x); // 0 

cube.position.x = 2; 
alert(cube.position.x); // 2 
alert(cube.x); // 2 

cube.x = 4; 
alert(cube.position.x); // 4 
alert(cube.x); // 4 

이 가능합니까?

나는 Three.js로 작업 중이라는 사실을 언급해야한다. 그래서 객체를 다시 작성하는 것은 옵션이 아니며 단지 프로토 타입을 추가하는 것 뿐이다.

+1

에만 [getter 및 setter를 (지원하는 브라우저에서이 작업을 수행 할 수 있습니다 https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects?redirectlocale=en-US&redirectslug=Core_JavaScript_1 .5_ 가이드 % 2FWorking_with_Objects # Defining_getters_and_setters). – zzzzBov

답변

1

cube.xcube.position.x이 포함 된 값을 반환하려면 obj.prototype.x에 접근 자 및 변형자를 정의해야합니다. 액세서와 뮤 테이터는 JavaScript의 비교적 새로운 기능으로, 대부분의 IE 버전에서 지원되지 않습니다.

var vector = function(x, y) { 
    this.x = x || 0; 
    this.y = y || 0; 
} 

var obj = function() { 
    this.position = new vector(0, 0, 0); 
} 
obj.prototype = { 
    ...your prorotype methods here... 
}; 
Object.defineProperty(obj.prototype, 'x', { 
    get: function() { 
     return this.position.x; 
    }, 
    set: function (val) { 
     this.position.x = val; 
    } 
}); 

//alternatively: 
obj.prototype = { 
    get x() { 
     return this.position.x; 
    }, 
    set x(val) { 
     this.position.x = val; 
    } 
}; 

var cube = new obj(); 
cube.x; //0 
cube.x = 10; 
cube.position.x; //10 
+0

@ alex23, 요점은 프로토 타입이 선언 될 위치의 자리 표시자를 표시하는 것이 었습니다. – zzzzBov

+0

당신은 최고입니다! 전에 액세서와 뮤 테이터에 대해 들어 보지 못했습니다. 나는 그것이 내가 온라인에서 대답을 찾을 수 없었던 이유라고 생각한다. 'Object.defineProperty (obj.prototype, 'x', {});와'obj.prototype = {};'의 차이점은 무엇입니까? 둘 다 표준으로 받아 들여 졌습니까? 하나 더 빠릅니까? – wackozacko

+0

리터럴에서'get x()'와'set x()'를 사용하는 것이 편리합니다. 'Object.defineProperty'는 접근 자 (accessor)와 돌연변이 자 (mutator)를 동적으로 빌드 할 수있는 것을 의미합니다. 이 액세서와 뮤 테이터를 사용하여 작성한 항목은 하위 호환되지 않습니다. – zzzzBov

관련 문제