2017-11-08 4 views
0

나는 자바 스크립트 (특히 NodeJS)의 컴포지션을 통해 객체 빌드를 둘러 보았고 내 객체를 구축하는 방법을 생각해 냈지만 이것이 미친 짓인지 알아야한다. 일을하는 방법.JS Object composition from prototype functions 추가하기

단순한 버전은 다음과 같습니다. 두 개의 객체가 있는데 두 객체는 ​​두 개의 속성을 가지고 하나는 숫자를 보유하고 다른 하나는 문자열을 보유합니다.

파일 : Cat.js

function Cat() { 
    this.name = 'Fuzzy Whiskerkins'; 
    this.owner = 'James'; 
} 
module.exports = Cat; 

파일 : Car.js

function Car() { 
    this.color = 'blue'; 
    this.owner = 'James'; 
} 
module.exports = Car; 

지금은 이러한 개체의 양쪽에있는 모든 속성에 대한 기본 게터/세터 기능을 추가하고 싶습니다. 또한이 세터에 전달 된 값이 유형과 일치하는지 확인할 수 있기를 원합니다.

파일 : StringProperty.js

module.exports = function(newObject, propertyName) { 
    newObject.prototype[propertyName] = function(newString) { 
    if (typeof newString !== 'undefined') { 
     if (typeof newString !== 'string') { 
     return; 
     } 
     this.properties.[propertyName] = newString; 
     return this; 
    } 
    return this.properties.[propertyName]; 
    } 
} 

파일 : Cat.js

var StringProperty = require('./StringProperty.js'); 
function Cat() { 
    this.properties.name = 'Fuzzy Whiskerkins'; 
    this.properties.owner = 'James'; 
} 
StringProperty(Cat, 'name'); 
StringProperty(Cat, 'owner'); 
module.exports = Cat; 

파일 대신 나는 다음을 수행 한 이러한 속성의 각 네 개의 프로토 타입 함수를 작성의 Car.js

var StringProperty = require('./StringProperty.js'); 
function Car() { 
    this.properties.color = 'blue'; 
    this.properties.owner = 'James'; 
} 
StringProperty(Car, 'color'); 
NumberProperty(Car, 'owner'); 
module.exports = Car; 

이제 두 개체 모두 필요한 기본 기능을 모두 갖추고있었습니다. 최소한의 코드로, 다른 문자열 속성을 추가해야 할 때마다 추가해야 할 코드의 양이 최소화됩니다.

나는 미친가요? 이 일을하는 더 좋은 방법은/미친 짓인가?

편집 : 내가 수행하려고하는 응용 프로그램은 100 개 이상의 개체가 있으며 각 개체는 10 개 이상의 속성을 갖고 있으며 각 개체에 대해 거의 동일한 코드를 작성해야한다는 생각입니다. 속성이 나와 잘 맞지 않습니다. 나는 속성을 추가하고 getter/setter 함수 (문자열 속성에 대한 다른 길이 제한과 같은 속성 제한에서 분기를위한 옵션 추가)을 생성하는 약간의 코드를 가질 수 있기를 원합니다. JS에서 컴포지션을 통해 객체 생성의 여러 예제를 살펴 보았지만 NodeJS 모듈 구조에 적합하지는 않았습니다.

+2

속성을 직접 가져 오거나 설정하여 아직 사용할 수없는 기능이 있습니까? –

+2

프로토 타입에 할당 된 기능과 속성에 직접 할당 된 값이 모두있는 경우 프로토 타입의 함수는 "숨김"상태가되어 일반적으로 전혀 사용되지 않습니다. 나는 우리가 당신을 더 잘 이끌 수 있도록 당신이 실제로 풀고 자하는 문제를 기술 할 것을 강력히 제안합니다. 나는 당신이 ['Object.defineProperty()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)를 통해 완전히 지원되는 getter와 setter를 사용해야한다고 생각합니다./Object/defineProperty) 또는'Object.defineProperties()'를 참조하십시오. – jfriend00

+0

@ Mark_M 새로운 값을 객체에 설정하기 전에 일련의 테스트를 실행하고 싶습니다. 이 테스트는 기본적으로 모든 속성에서 동일하며 동일한 코드를 반복해서 복사하여 붙여 넣기를 거의하고 싶지 않습니다. –

답변

0

솔루션이 작동하지 않습니다. 값을 설정하자마자 액세서 메서드가 섀도 잉됩니다. 또한 문자열을 예상하는 메서드에서 typeof !== "number"을 테스트하는 이유는 무엇입니까?

이러한 문제를 해결하면 유형 검사가 자동으로 종료됩니다. 일단 값을 설정하려고 시도하고 설정 이유를 파악할 수 없다면 싫어할 것입니다. 더 강한 타입의 시스템을 원한다면 TypeScript를 사용합니다.

관용 JS 코드를 작성하는 것이 더 좋을 것이라고 생각합니다. 언어가 제공하는 기능을 가장 단순하고 직접적인 방식으로 사용하십시오. 이 구조들에 너무 영리하지 않으려 고 노력하십시오. JS가 모든 새로운 기능을 갖추기 전에 사람들은 이와 같은 것을 시도해 보았습니다.

+0

'typeof! == "number"는 생산 코드를 간단한 예제로 변환 할 때 실수였습니다. 섀도 잉에 관해서는, 내가 테스트했던 코드는 덮어 쓰지 않도록하기 위해 해시'this.properties.propertyName = '에 속성을 넣는 것이 었습니다. 새로운 값이 설정되지 않은 이유를 설명하기 위해 인쇄 할 로깅 기능이 있습니다. 내가 원했던 것을 설명하기 위해 원래 게시물을 편집 할 것입니다. –