1

개체의 모든 인스턴스화에 전달 된 config 개체에 영향을주기 위해 한 곳에서 변경하려고합니다. 목적은 var myFoo = new Crayons().foo({color: "red"});생성자에 전달 된 객체의 기본 속성을 어떻게 설정합니까?

내 프로젝트에 초기화 나는 누군가가 전달하지 않는 경우 있도록 기본을 {color: "blue"}하고 싶습니다

function Crayons(){ 
    return { 
    foo: ThirdPartyFoo 
    } 
} 

다음과 같이 객체는 전 세계적으로 사용할 수 있습니다 색상, 파란색이 설정됩니다.

나는

function Crayons(){ 
    var fooWithDefaults = function(){ 
    this = new ThirdPartyFoo(arguments); //this is invalid 
    this.color = "blue"; //and this would overwrite color if it was set 
    } 

    return { 
    foo: fooWithDefaults 
    } 
} 

을하고 노력하지만 기본적으로 this = new 3rdPartyFoo을 말한다 자바 스크립트 생성자를 만드는 방법을 알고하지 않는 한 new 키워드는, 저를 던지고있다.

무엇이 누락 되었습니까?

당신은 생성자를 장식 할 수 있습니다
+3

'this.color =이 || 제공 "blue"' – Li357

+0

@AndrewL. 그 색상에 대해 작동하지만, 여전히 개체를 구성하는 방법을 모르겠습니다. – adamdport

+0

첫째, '크레용'은 진정한 생성자로 구현되는 것이 아니라 공장으로 구현됩니다. 따라서'new' 연산자로 호출 할 필요가 없습니다. 둘째, '크레용'에는 foo 메소드가 없습니다. 이 함수가 호출되면 생성자가 될 수있는'ThirdPartyFoo'를 참조하는 속성'foo'를 특징으로하는 객체를 반환합니다. 적어도 유효한 코드이거나 오류를 발생시키지 않고 실행할 수있는 예제로 수정하십시오 (var myFoo = new Crayons.foo ({color : "red"});))') –

답변

2

:

function Crayons(){ 
    function fooWithDefaults() { 
    3rdPartyFoo.apply(this, arguments); // this is what you're looking for 
    if (!this.color) // or whatever to detect "not set" 
     this.color = "blue"; 
    } 
    fooWithDefaults.prototype = 3rdPartyFoo.prototype; // to make `new` work 

    return { 
    foo: fooWithDefaults 
    } 
} 

또는 당신은 단지 그것을 인스턴스를 반환하는 공장합니다

여기
function Crayons(){ 
    function fooWithDefaults(arg) { 
    var that = new 3rdPartyFoo(arg); // you should know how many arguments it takes 
    if (!that.color) // or whatever to detect "not set" 
     that.color = "blue"; 
    return that; 
    } 

    return { 
    foo: fooWithDefaults 
    } 
} 

당신은 또한 new 호출 var myFoo = Crayons.foo({color: "red"});

을 드롭 할 수 있습니다

생성 된 인스턴스를 수정하는 대신 전달 된 옵션을 꾸미는 것이 좋습니다. 일반적으로 더 나은 솔루션 인에서 :

function Crayons(){ 
    function fooWithDefaults(arg) { 
    if (!arg.color) // or whatever to detect "not set" 
     arg.color = "blue"; 
    return new 3rdPartyFoo(arg); 
    } 

    return { 
    foo: fooWithDefaults 
    } 
} 
+0

나는 리팩토링을 피하려고 노력하면서 "새'를 버리고 싶지 않습니다. 귀하의 첫 번째 솔루션은 제가 찾고 있던 것입니다. 감사! – adamdport

+0

나는'fooWithDefaults'를 호출 할 때'new'를 드롭 할 수 있음을 의미합니다. 세 번째 솔루션이 가장 깨끗한 솔루션이라고 생각합니다. – Bergi

0

function ThirdPartyCrayon(config) {   // constructor :: possible original Crayon implementation 
 

 
    Object.assign(this, config); 
 
    this.type = "thirdpartycrayon"; 
 
} 
 

 

 
function createCrayonSetting(defaultConfig) { // factory (creates a closure) 
 

 
    function CrayonWithDefaults() {   // constructor :: customized Crayon wrapper 
 

 
     Object.assign(this, defaultConfig); 
 
     ThirdPartyCrayon.apply(this, arguments); 
 
    } 
 

 
    return { 
 
     Crayon: CrayonWithDefaults 
 
    } 
 
} 
 

 

 
var 
 
    setting = createCrayonSetting({color: "blue", strokeWidth: "thin"}), 
 

 
    crayon1 = new setting.Crayon({color: "red", strokeWidth: "bold"}), 
 
    crayon2 = new setting.Crayon({color: "green"}); 
 
    crayon3 = new setting.Crayon(); 
 

 

 
console.log("crayon1 : ", crayon1); 
 
console.log("crayon2 : ", crayon2); 
 
console.log("crayon3 : ", crayon3);